2017-12-02 12 views
1

SVNリビジョンIDに基づいてコミットのローカルハッシュを取得したいときは、通常git svn find-revを実行します。しかし、このコマンドは、現在のブランチ、またはリビジョン後にコマンドで明示的に指定されたブランチ内のコミットのみを検索するという大きな不都合があります。`git svn find-rev`でリポジトリ全体を検索する

時々、私はリビジョンIDだけを知っているので、ブランチ名を知らずにローカルハッシュを探したいと思うことがあります。 git svn find-revでそれを行う方法はありますか? SVNのリビジョンがユニークであることを知っていると意味があります。

EDIT:

それを行うには良い方法はありません、判明。 解決策を提供する答えを受け入れましたが、鉱山のような膨大な数の分岐を持つリポジトリを検索するには時間がかかります。私は自分のシェル関数を書いてはるかに高速に動作している、git svnとの組み合わせで、通常の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]" 
} 

あなたがそれを使用している場合は、GNUでいないのであれば、あなたはgrep -P部品を交換する必要があるかもしれません/ Linux。リビジョンは "r"接頭辞の有無にかかわらず指定できます。

答えて

1

:あなたはリビジョンr9からコミット対応する取得したい場合など

することは、あなたは以下のようにr9として変数rev値を指定することができます。 g。それはより信頼性が、それでも速い持つために

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

を行い、あなたが一致するものが見つかった後、中断されますされるまで、すべての参照文献を通じて見えもう少し複雑なライン、Eでそれを行うことができます。 g。 like

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

はい、かなりの時間が必要です。特に、多くの参考文献を持っている場合や、e。 g。すべてのリファレンスを与え、リビジョンが複数のブランチ、またはいくつかのブランチといくつかのタグにある場合、結果は複数回取得されます。しかし、私が知っている唯一の短い方法です。それ以外の場合は、基本的に同じことを行い、結果を見つけたらすぐに停止するループを作成する必要があります。 – Vampire

+0

さて、リポジトリ全体で確実に動作し、何かが見つかるとすぐに停止する別の1ライナーを投稿しました。 eにソートを追加することで、少し修正することができます。 g。最初にローカルブランチを調べ、次にリモートブランチに入り、次にタグなどにします。 – Vampire

0

git svn find-revは、現在のブランチからのコミットsha-1値を示しています。しかし、シェルスクリプトを使用して、リポジトリ全体からコミットを検索することができます。あなたは電子ことができ、すべての支店で検索するには

#!/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 
関連する問題