3

チームでコーディングスタイルを強制しようとしています。そこで、プッシュされているすべてのファイルをチェックするgitupdateフックを作成しました。

ただし、リモートに存在するブランチでは完全に機能しますが、新しいブランチでは正しく機能しません。

既存のブランチ上のファイルのリストを取得するには、を使用しますgit diff --name-status --diff-filter=AM oldrev newrev。ここで、oldrevとnewrevは、引数として取得するSHA1です。

この同じ行を新しいブランチに使用すると失敗し、0{40}が不正なオブジェクトであると報告されます。少しブラウジングした後、私はこれを使用できることがわかりました:git diff-tree --root newrev。ただし、このコマンドは、プッシュされた最後のコミットのファイルのみを返し、ブランチ内のすべてのファイルを返すわけではありません。

新しいブランチの場合、プッシュされているブランチ内のすべてのファイルのすべての名前を取得する方法はありますか?

4

1 に答える 1

0

試しましたgit rev-list --first-parent newrevか?newrevブランチが由来するrefとの間のすべての回転をリストしているようです。たとえば、このリポジトリでは次のようになります。

$ git log --all --graph --decorate
* commit 03f6357bdcacfc8c8253ccb140f25010810c4433 (HEAD, origin/new_branch, new_branch)
|     Fifth
* commit 291d88908fefa94eab0c9483ad6b8ab5ebca21f6
|     Third
* commit 3ff20b8998d037cd9c9bb1ff53b1887837d9ed8e
|     Second
| * commit e9c2e99de892499d2b6037c8c0913a52dbade4c0 (origin/master, master)
|/      Fourth  
* commit 9574226673ffe2d04ae4e36b4d7976399320e29f
      First

rev-list次のようになります。

$ git rev-list --first-parent 03f6357bdcacfc8c8253ccb140f25010810c4433
03f6357bdcacfc8c8253ccb140f25010810c4433
291d88908fefa94eab0c9483ad6b8ab5ebca21f6
3ff20b8998d037cd9c9bb1ff53b1887837d9ed8e
9574226673ffe2d04ae4e36b4d7976399320e29f

これをベース参照のみに制限することができますtail -1(これをよりエレガントに行うためのCLIオプションはまだ見つかりません):

$ git rev-list --first-parent 03f6357bdcacfc8c8253ccb140f25010810c4433 | tail -1
9574226673ffe2d04ae4e36b4d7976399320e29f

git diffそして、そこから、元のコマンドを使用できます。

$ origrev=`git rev-list --first-parent 03f6357bdcacfc8c8253ccb140f25010810c4433 | tail -1`
$ git diff --name-status --diff-filter=AM $origrev 03f6357bdcacfc8c8253ccb140f25010810c4433
A       bar
于 2013-03-10T08:15:55.143 に答える