3

我正在尝试在我的团队中强制执行一些编码风格。所以我写了一个 git update 钩子,它检查所有被推送的文件。

但是,它适用于远程现有的分支,但它不适用于新分支。

要获取现有分支上的文件列表,我使用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和分支来自的参考。例如,在这个 repo 中:

$ 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 回答