インターネットは、この質問に対する間違った回答と理想的でない回答を絶対に散らばっています。これはあなたがしたいと思う共通のものだと思うので、残念です。プレコミットフックでコミットしようとしているものをテストする
問題:pre-commit
フックが実行されると、リポジトリがきれいでない可能性があります。あなたがテストを素朴に実行すると、あなたがコミットしているものに反することはありませんが、作業中のツリーには何らかの傷があります。
明らかにするべきことは、終了時にpre-commit
とgit pop
の先頭のgit stash --keep-index --include-untracked
です。そうすれば、私たちが望む(純粋な)インデックスに対してテストします。
残念ながらgit add --patch
を使用すると(特にハンクを編集する場合)、[email protected]{0}
の内容がコミット後の作業ツリーと一致しない可能性があるため、マージ競合マーカーが生成されます。
もう1つの一般的な解決方法は、リポジトリを複製して新しい一時的なテストでテストを実行することです。一つは、まだコミットしていないということです。私たちがコミットしようとしている状態で、リポジトリのコピーを簡単に手に入れることはできません(私はそうする方法があると確信しています、私は興味がないから:)。第二に、私のテストは現在の作業ディレクトリの場所に敏感かもしれません。たとえば、ローカル環境設定のためです。
So:git stash --keep-index --include-untracked
の前に、マージ競合マーカーを導入せずに、コミット後のHEAD
を変更せずにワークツリーを復元するにはどうすればよいですか?
プリコミットスクリプトは、入力として、コミットされたデータを受信します。なぜあなたは何か他のものを見る必要がありますか?おそらくあなたがやろうとしていることは、プレコミットフック以外の何かの中で最もうまくいくでしょう。あなたは完全なリポジトリにアクセスする必要がありますか? –
@WilliamPursell: "コミットされているデータ"とはどういう意味ですか?プリコミットスクリプトは、作業ツリー(つまり、ソースリポジトリのベース)で実行されます。問題は、リポジトリにいくつか変更を加えていくつかのファイルを追加するだけで(例えば、いくつかのファイルを追加するが他のものは追加しない場合)、コミットが起こる前にテストしないことです。作業ディレクトリにあるものは何でもテストします。 – pwaller
あなたがコミットしているパッチはstdin上でpre-commitフックに利用できます。コミットされているパッチではない場合、何をテストしていますか?プリコミットフックの目的は、パッチを検証することです。 –