2017-12-02 338 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 
相關問題