20

指定されたshaのコミットが現在のブランチに存在するかどうかを検証する方法は?

出力を解析する方法はたくさんありますが、ブール値を返す最適な方法が必要です (bash スクリプトで使用するため)。

例えば

sha=$1
if [ -z `git magic --validate $sha` ]; then
  echo "Invalid commit sha: $sha"
  exit 1
fi
4

6 に答える 6

23
git rev-parse --quiet --verify <commit>

コミット(SHA1が意味するものだと思います)が存在することを実際に確認しません。指定された SHA1 に対応するオブジェクトがデータベースに存在することを確認します。つまり、SHA1 に一致する BLOB またはツリー オブジェクトが存在する場合、それがコミットでなくても存在すると報告されます。

git rev-parse --quiet --verify <sha1>^{commit}

これにより、オブジェクトが存在し、コミット (コミットまたは注釈付きタグ) として使用できるオブジェクトであることが確認されます。

于 2014-02-19T11:18:08.953 に答える
4

rev-list | grepメソッドは正常に機能します。git が表示するためにすべての SHA1 を出力する必要があるため、ごくわずかなオーバーヘッドがありますgrepが、実際には大したことではありません。

必要に応じてそれを行うこともできgit merge-baseます-ターゲットコミットとブランチのマージベースがターゲットコミットである場合、ブランチにはターゲットコミットが含まれます:

if [ "$(git merge-base $commit $branch)" = "$commit" ]; then
    ...
fi

rev-listいずれにせよ、およびは SHA1 を出力することに注意してください。そのmerge-baseため、包含をテストしているコミットがブランチまたはタグによって名前が付けられている場合は、git rev-parse最初にそれを SHA1 に変換するために使用する必要があります。

于 2010-11-08T23:18:20.323 に答える
4

の出力を見ることができます

git rev-list HEAD..$sha

リポジトリに sha1 がまったく存在しないためにこのコマンドが失敗した場合、終了コードはゼロ以外になります。出力が空の場合、コミットは現在のブランチにあり、空でない場合はそうではありません。したがって、スクリプトは次のようになります

if revlist=`git rev-list HEAD..$sha 2>/dev/null` && [ -z "$revlist" ]; then
    :
fi

$shaコミットを実際に (SHA1 ハッシュまたはその他の方法で) 命名することが既にわかっている場合、これは次のように単純化されます。

if [ -z "`git rev-list HEAD..$sha`" ]; then
    :
fi
于 2010-11-08T21:07:47.963 に答える
3

git cat-file は、リポジトリ内のオブジェクトに関する情報を出力します。「-e」は、オブジェクトが有効であるかどうかをチェックし、ステータス 0 で終了し、無効である場合は 1 で終了します。

git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5
echo $?
1
于 2015-08-18T12:35:27.083 に答える
2
git merge-base --is-ancestor $sha HEAD

$shaこれは、現在のブランチ ( ) の祖先コミットであるかどうかをテストし、そうである場合はHEAD正常に終了します。

あなたの例では、

sha=$1
if ! git merge-base --is-ancestor $sha HEAD; then
  echo "Invalid commit sha: $sha"
  exit 1
fi
于 2015-09-07T17:40:32.163 に答える
1
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in

条件で grep からの終了コードを使用できます。

現在のブランチの場合、

 git rev-list HEAD | grep -q sha-youre-interested-in
于 2010-11-08T21:06:55.573 に答える