使 `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 函数,并结合使用常规 svn
和 git 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)')
当我想根据 SVN 修订版 id 获取提交的本地哈希时,我通常 运行 git svn find-rev
。但是,一个很大的不便是,该命令只会在当前分支中查找提交,或者在修改后的命令中明确指定的分支中查找。
有时候只知道revision id,想在不知道分支名的情况下找本地hash。有没有办法用 git svn find-rev
做到这一点?知道 SVN 修订版是独一无二的,这是有道理的。
编辑:
原来,没有什么好办法。
我接受了答案,它提供了一个解决方案,但是搜索像我这样有大量分支的存储库需要很长时间。我最终编写了自己的 shell 函数,并结合使用常规 svn
和 git 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)')