HEAD と HEAD^1 の間でファイルが変更されたときに S3 にファイルを再アップロードする rake タスクを作成しています。これを行うには、どの git コマンドを使用する必要がありますか。この2つを比較することに意味はhash-object
ありますか?
2 に答える
単一の既知のファイルがコミットによって変更されたかどうかを確認したい場合は、次を使用できます
git diff --quiet HEAD^ HEAD -- <filename>
次に、終了コードを調べて、変更されたかどうかを判断します。変更されていない場合、終了コードは 1 になります。変更されていない場合、終了コードは 0 になります。この方法を使用すると、出力を解析して、ファイルが言及されているかどうかを確認する必要はありません。あなたが気にすること。
HEAD@{1}
この場合でも、「ではなく」を使用するという Adam の提案HEAD^
は検討する価値があります。
あなたが使用することができます
git log --stat HEAD^..HEAD
変更されたファイルのリストを取得します。--raw
完全なパスが表示されるようにするような他の修飾子があります。--stat=200
を使用して、出力が 200 文字幅であると想定し、パスのみを切り捨てるようにログに指示することもできます。
考慮すべきことの 1 つは、新しいコミットが 1 つだけではない場合があるということです。最後のコミットが何であったかを確認するには、HEAD@{1}
代わりに使用する必要があります。HEAD^
次に、使用する必要があります
git diff --stat HEAD@{1}..HEAD
HEAD@{1}
は「HEAD が最後に指した場所」として解釈されます。つまりHEAD@{2}
、「2回変更する前のHEADの場所」を意味します。ドキュメントを見ると、reflog
そこでさらに説明されています。
スクリプトの場合、パスをまったく省略しないため、--numstat
代わりに使用します。--stat
このリストを使用して、これらのファイルだけを移動したり、削除済みとしてマークされているファイルを削除したりできます。
また、各コミットのツリー オブジェクトを比較すると、SHA1 の違いを再帰的に確認できます。
さらに、更新フック内でこれをスクリプト化すると、フックへの引数によってブランチ名oldref
とnewref
一緒に と の両方が提供されるため、ブランチが現在何であり、何に設定されているかを正確に知ることができます。
しかし、これは理想ではありません。可能であれば、作業ツリー全体を上書きして、頭を悩ませないようにしてください。