使 `git svn find-rev` 搜索整个存储库

Make `git svn find-rev` search the whole repository

当我想根据 SVN 修订版 id 获取提交的本地哈希时,我通常 运行 git svn find-rev。但是,一个很大的不便是,该命令只会在当前分支中查找提交,或者在修改后的命令中明确指定的分支中查找。

有时候只知道revision id,想在不知道分支名的情况下找本地hash。有没有办法用 git svn find-rev 做到这一点?知道 SVN 修订版是独一无二的,这是有道理的。

编辑:

原来,没有什么好办法。 我接受了答案,它提供了一个解决方案,但是搜索像我这样有大量分支的存储库需要很长时间。我最终编写了自己的 shell 函数,并结合使用常规 svngit svn,这样运行速度更快:

gitrev()
{
  if [ -z "" ]; then
    echo "${FUNCNAME[0]} <revision> [git_args]"
    return 1
  fi
  local rev b
  rev=""
  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" 前缀来指定版本。

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

比如你想从修订版r9获取相应的commit,那么你可以指定变量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

要在所有本地分支机构中搜索,您可以 e。 G。做

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

为了让它更可靠但仍然快速,您可以使用稍微复杂一点的行来完成它,该行会查看所有 refs 直到找到匹配项然后中止,例如。 G。喜欢

while read ref; do result="$(git svn find-rev r123456 "$ref")"; [ -n "$result" ] && echo $result && break; done < <(git for-each-ref --format='%(refname)')