2017-12-02 404 views
1

当我想要根据SVN修订版本id获取提交的本地散列时,我通常运行git svn find-rev。但是,一个很大的不便之处在于,该命令只会查找当前分支中的提交或修订后的命令中明确指定的分支。让`git svn find-rev`搜索整个版本库

有时,我只知道修订ID,我想在不知道分支名称的情况下找到本地散列。有没有办法用git svn find-rev来做到这一点?这是有道理的,知道SVN修订是独一无二的。

编辑:

事实证明,没有做到这一点没有什么好办法。 我接受了答案,该答案提供了一个解决方案,但搜索具有大量分支的存储库(如我的)需要很长时间。最后我写我自己的壳功能,结合使用常规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" "[email protected]" 
} 

如果你使用它,你可能需要更换grep -P一部分,如果你不是在GNU/Linux操作系统。可以使用或不使用“r”前缀来指定修订版本。

回答

1

要在所有地方分公司,你可以通过电子邮件进行搜索。 G。做

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

拥有它更可靠,但仍快,你可以用一点点做更复杂的线条,看起来在所有裁判,直到找到一个匹配,然后中止,E。 G。像

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

似乎喜欢它,但在我的情况下,我也必须搜索远程分支机构,这需要很多时间。 – Thunderbeef

+0

是的,可能需要相当长的一段时间,特别是如果你有很多参考资料,并且你的电子邮件。 G。给所有的参考文献,修订版本在多个分支,或者在一些分支和一些标签中,你会多次得到结果。但这是我所知道的唯一的方式。否则,您必须编写一个基本相同的循环,并在找到结果后立即停止。 – Vampire

+0

好吧,我发布了另一个可以在整个存储库中可靠工作的单线程,并在找到某个东西后立即停止。您可以通过向e添加排序来修改它。 G。先查看本地分支,然后查看远程分支,然后查看标签或类似的东西。 – Vampire

0

git svn find-rev确实显示来自当前分支的提交sha-1值。但你可以使用shell脚本搜索整个回购的提交。

这样的,如果你想从修订r9相应提交的,那么你可以为r9如下指定变量rev值:

#!/bin/sh 

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