20

タブを含むファイルを含むプッシュをリモートリポジトリで拒否したいのですが、ファイルが特定のクラス(ファイル名に基づく)に属している場合に限ります。それは可能ですか?
私はupdate hookgithooksを少し見てきましたが、それは正しいと思います。

つまり、次の場合、プッシュは拒否されます。

  1. リストされたタイプのファイルがあります(*.cpp、、)*.hCMakeLists.txt
  2. 1つ以上のタブ文字が含まれています。
4

3 に答える 3

15

うーん、この質問は見過ごされているようです。あなたがまだそこにいることを願っています、エスベン!

ref が更新されるたびに 1 回実行されるupdate hookを探しています。引数は、ref の名前、古いオブジェクト名 (コミット SHA1)、および新しいオブジェクト名です。

したがって、実際に行う必要があるのは、古いものと新しいものの違いをチェックして、それが基準を満たしていることを確認することだけです. もちろん、これは完全に簡単ではありませんが、完全に管理可能です。これが私がすることです:

次のスクリプトを に保存します.git/hooks/update

old=$2
new=$3

# that's a literal tab, because (ba)sh turns \t into t, not a tab
# make sure your editor doesn't expand it to spaces
git diff --name-only $old $new | egrep '(\.(cpp|h)$)|^CMakeLists.txt$' | xargs -d'\n' git diff -U0 $old $new -- | grep -q '^+.* ' && exit 1

これは、古いものと新しいものとの間で異なるすべてのファイルをリストし、必要なすべてのファイルをgrepし、それらの差分を取得し(気にしないため、コンテキストの行は0行で)、追加された行をgrepsします(で始まる+)タブを含む。見つかった場合、grep は成功して終了します。これにより、&&runが実行さexit 1れ、フックが失敗して終了し、更新が中止されます。

これは要件とは少し異なることに注意してください - 差分がタブ文字を追加するかどうかをチェックします。これはおそらく長期的には優れています。既存のコードが問題ないことを確認したら、すべてのコンテンツを検索する必要がないため、はるかに高速であることを除いて、同じことです。

于 2010-11-10T14:44:20.090 に答える
3

pre-push hookを設定することもできますが、これは実際には git パブリケーション メカニズムの精神に沿ったものではありません。

私はむしろ一緒に行きたい:

  • pre-commit hook、間違った内容のコミットを防ぎます
  • または、適切な種類のファイルに簡単に関連付けることができ、不適切なコンテンツを修正または報告できるフィルター ドライバー。
于 2010-10-21T13:01:44.643 に答える