10

チームにいくつかのコーディング規則を適用しようとしています。その目的のために、クライアント側のフックをいくつか作成しましたが、これらは問題なく動作しますが、開発者が変更を中央リポジトリにプッシュするときに同じチェックを実行する必要があります。しかし、それらは機能しません。

これが私がやりたいことです:

プッシュされたファイルを 1 行ずつトラバースし、コーディング規則違反をチェックし、見つかった場合はプッシュを拒否し、行番号と違反も表示したいと考えています。

私の pre-commit クライアント側フックではgit diff --cached --name-status --diff-filter=AM、変更されたファイルのリストをgit cat-file -p :filename取得するために呼び出し、最初の呼び出しで取得されたファイルごとにファイルのテキスト全体を取得することで、これを行うことができました。

サーバー側のフックで同じことをしようとすると、update(ファイルのリストに対して) 空の文字列が返されます。

また、呼び出してみgit show --pretty="format:" --name-only newrevました (ここで、newrev は更新フックへのパラメーターとして取得する SHA でgit diff-tree -r --name-only --no-commit-id <tree-ish>あり、ネット上で見つけた他のものですが、何が起こっているのか、何を呼び出す必要があるのか​​ を明確に理解することはできません.

手伝って頂けますか?

4

1 に答える 1

6

サーバー側には作業コピーがなく、git diff --cachedサーバーがプッシュを受信したときにインデックスが空である間、ステージング領域 (またはインデックス) で動作するため、スクリプトを変更する必要があります。

git diff --name-status <sha-old> <sha-new>代わりに、引数としてフックに送信sha-oldされた ref を使用するだけで、コミット前にsha-new実行した場合と同じ出力が得られます。git diff --cached

ファイルの内容を確認するには、次を使用できますgit show sha-new:/path/to/file

于 2013-03-09T18:58:12.870 に答える