使 `git svn find-rev` 在整个代码库中搜索

4
当我想要获取基于SVN版本号的提交的本地哈希时,通常会运行git svn find-rev。然而,这个命令的一个大不便之处是,它只会在当前分支或在命令中明确指定的分支中查找提交。

有时,我只知道版本号,想要找到本地哈希,而不知道分支名称。是否有一种方法可以使用git svn find-rev实现呢?这很有意义,因为SVN版本号是唯一的。

编辑:

结果发现,没有很好的解决方法。我接受了提供解决方案的答案,但在搜索具有大量分支的存储库时,它需要太长时间。最终,我编写了自己的shell函数,并结合使用常规的svngit svn,速度快多了。

gitrev()
{
  if [ -z "$1" ]; then
    echo "${FUNCNAME[0]} <revision> [git_args]"
    return 1
  fi
  local rev b
  rev="$1"
  shift
  b="$(svn log -v -c "$rev" "$SVN_BRANCHES_URL" | grep -m1 -Po '/branches/\K[^/]+')" &&
  git svn find-rev "r${rev#r}" "origin/$b" "$@"
}

如果你使用它,如果你不在GNU/Linux上,你可能需要替换grep -P 部分。修订版可以带或不带“r”前缀指定。
2个回答

2

要在所有本地分支中搜索,您可以执行以下操作:

git for-each-ref --format='%(refname)' refs/heads/ | xargs -l git svn find-rev r123456

为了让它更可靠但仍然快速,你可以使用稍微复杂一点的代码行,它会查找所有引用,直到找到匹配项,然后终止,例如:
while read ref; do result="$(git svn find-rev r123456 "$ref")"; [ -n "$result" ] && echo $result && break; done < <(git for-each-ref --format='%(refname)')

似乎是这样,尽管在我的情况下我还必须搜索远程分支,这需要很长时间。 - Thunderbeef
是的,这可能需要相当长的时间,特别是如果您有许多引用,并且例如提供了所有引用并且修订在多个分支中或在某些分支和某些标签中,则会多次获得结果。但这是我知道的唯一简短的方法。否则,您必须编写一个基本上执行相同操作并在找到结果后立即停止的循环。 - Vampire
好的,我给你发了另一个一行代码,在整个代码库中可靠地工作,并且一旦找到就停止。你可以通过添加排序来稍微修改它,例如首先查看本地分支,然后查看远程分支,再查看标签或类似的东西。 - Vampire
给有帮助的答案点赞,包括你正在接受的答案 :-) - Vampire
用 while 循环太慢了吗?这里运行得相当快。你使用了什么其他方法? - Vampire
显示剩余2条评论

0

git svn find-rev 可以显示当前分支的提交 sha-1 值。但是你可以使用 shell 脚本从整个仓库中搜索提交

例如,如果你想要从版本 r9 获取相应的提交,则可以将变量 rev 的值指定为 r9,如下所示:

#!/bin/sh

rev="r9"
for branch in $(git branch -r)
do
{
  sha=$(git svn find-rev $rev $branch)
  if [ ! -z "$sha" ]; then
  {
    echo "The revision $rev has the corresponding commit is $sha. And the commit is on $branch branch."
    break
  }
  fi
}
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接