2

HEAD と HEAD^1 の間でファイルが変更されたときに S3 にファイルを再アップロードする rake タスクを作成しています。これを行うには、どの git コマンドを使用する必要がありますか。この2つを比較することに意味はhash-objectありますか?

4

2 に答える 2

3

単一の既知のファイルがコミットによって変更されたかどうかを確認したい場合は、次を使用できます

git diff --quiet HEAD^ HEAD -- <filename>

次に、終了コードを調べて、変更されたかどうかを判断します。変更されていない場合、終了コードは 1 になります。変更されていない場合、終了コードは 0 になります。この方法を使用すると、出力を解析して、ファイルが言及されているかどうかを確認する必要はありません。あなたが気にすること。

HEAD@{1}この場合でも、「ではなく」を使用するという Adam の提案HEAD^は検討する価値があります。

于 2012-10-31T17:25:02.150 に答える
3

あなたが使用することができます

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 の違いを再帰的に確認できます。

さらに、更新フック内でこれをスクリプト化すると、フックへの引数によってブランチ名oldrefnewref一緒に と の両方が提供されるため、ブランチが現在何であり、何に設定されているかを正確に知ることができます。

しかし、これは理想ではありません。可能であれば、作業ツリー全体を上書きして、頭を悩ませないようにしてください。

于 2012-10-31T17:09:10.497 に答える