ステージングされたファイルを変更するpre-commitフックの場合、フックの実行後に何をステージングする必要があるかを理解する必要があります。
pre-commitフックは、コミットする必要のあるファイルにきれいな印刷を適用します。フックは次のタスクを実行します。
- タブをスペースに置き換えます
- 行末の末尾の空白を削除します
- 二重の空行を削除します*)
- 欠落している場合は、ファイルの最後に空の行を追加します*)
*)でマークされたアクションは、以下に説明する問題を引き起こしているアクションです。
これらが行われた後、フックはを使用して変更されたファイルをインデックスに追加しますgit add $filename
。そうすることで、ファイル全体がステージングされ、変更されたファイルのごく一部(つまりハンク)のみをコミットできなくなります。
もちろん、git add --no-verify
フックをバイパスすることはできますが、を使用する場合はそのオプションを使用できませんgit gui
。また、ファイルのステージングされた行にきれいな印刷を適用したいので、フックをバイパスすることは私の目的ではありません。
ファイル全体をステージングする代わりに、フックの実行後に適切なコンテンツをステージングできるように、きれいな印刷が適用された後にインデックスに何を追加する必要があるかを見つける方法はありますか?
編集1:David Brigadaによって提供され
た答えは有望に見えますが、機能しません:ステージングされた変更をそのまま残します(これは良い部分です)が、(少なくともmsysgitでは)すべての変更を(ステージングされていないものだけでなく)隠し場所に入れますもの)。これにより、ステージングされた行が変更される可能性があるため、スタッシュをWCに戻すときにマージの競合が発生します。git stash --keep-index
編集2: gitがスタッシュをダーティなWCにマージすることを拒否しているため、 David
の更新された回答は成功しません。
編集3:larsksから
の答えは、の使用法を示しています。一見すると、これは正しいように見えますが、チェックインされたバージョンがフィルターを介して実行され、WCがチェックインされたバージョンとは異なることは非常に混乱しています。少なくとも、それは私の経験であり、GitBookの次のコメントによって裏付けられています。.gitattributes
これらの変更をコミットしてファイルを再度チェックアウトすると、キーワードが適切に置き換えられていることがわかります
ファイルを削除してからもう一度チェックアウトして、フィルターによって適用された変更を確認する必要がありますか?とんでもない!これ以上のヒントはありますか?