指定されたshaのコミットが現在のブランチに存在するかどうかを検証する方法は?
出力を解析する方法はたくさんありますが、ブール値を返す最適な方法が必要です (bash スクリプトで使用するため)。
例えば
sha=$1
if [ -z `git magic --validate $sha` ]; then
echo "Invalid commit sha: $sha"
exit 1
fi
git rev-parse --quiet --verify <commit>
コミット(SHA1が意味するものだと思います)が存在することを実際に確認しません。指定された SHA1 に対応するオブジェクトがデータベースに存在することを確認します。つまり、SHA1 に一致する BLOB またはツリー オブジェクトが存在する場合、それがコミットでなくても存在すると報告されます。
git rev-parse --quiet --verify <sha1>^{commit}
これにより、オブジェクトが存在し、コミット (コミットまたは注釈付きタグ) として使用できるオブジェクトであることが確認されます。
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 に変換するために使用する必要があります。
の出力を見ることができます
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
git cat-file は、リポジトリ内のオブジェクトに関する情報を出力します。「-e」は、オブジェクトが有効であるかどうかをチェックし、ステータス 0 で終了し、無効である場合は 1 で終了します。
git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5
echo $?
1
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
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in
条件で grep からの終了コードを使用できます。
現在のブランチの場合、
git rev-list HEAD | grep -q sha-youre-interested-in