如何列出提交中的所有文件?

Phi*_*rie 2619 git git-show

我正在寻找一个简单的git命令,它提供了一个格式良好的所有文件列表,这些文件是散列(SHA1)给出的提交的一部分,没有任何无关的信息.

我试过了:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d
Run Code Online (Sandbox Code Playgroud)

虽然它列出了文件,但它还包含每个文件的不需要的差异信息.

是否有另一个git命令只提供我想要的列表,以便我可以避免从git show输出中解析它?

Rya*_*ary 3498

首选方式(因为它是一个管道命令;意味着是程序化的):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js
Run Code Online (Sandbox Code Playgroud)

另一种方式(不太喜欢脚本,因为它是一个瓷器命令;意味着面向用户)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js
Run Code Online (Sandbox Code Playgroud)
  • --no-commit-id抑制提交ID输出.
  • --pretty参数指定一个空格式字符串,以避免开始时的残缺.
  • --name-only参数仅显示受影响的文件名(Thanks Hank).
  • --name-status参数是递归到子树

  • 用`--name-status`替换`--name-only`选项将给出更清晰的摘要. (312认同)
  • 应该注意,查看根提交时,`diff-tree`将不起作用. (24认同)
  • `git log --name-only -n 1 <hash>`最后一次提交是:`git log --name-only -n 1 HEAD~1..HEAD` (22认同)
  • 如果您希望它在根提交上工作,请使用--root标志.从手册页:"当指定--root时,初始提交将显示为一个大的创建事件.这相当于对NULL树的差异." (19认同)
  • 如果有人想知道(就像我一样)为什么第一种方式是"首选",那么它可以追溯到@drizzt的评论; `git show`是"瓷器"(意思是面向用户)和`git diff-tree`是"plumbing"(意味着以编程方式使用,例如来自脚本).前者的接口可能会随着时间的推移而改变(因此git维护者可能会因为可用性原因而丢弃`--name-only`,尽管我不认为他们会出现这种情况),而后者的接口将尽可能保持稳定兼容性原因. (9认同)
  • 这不适用于合并提交.消息:`将bitbucket.org:xxx/xxx的分支'<branch>'合并到master`中 (3认同)
  • @ user1598390 -r recurses into sub-trees.您可以通过`man git-diff-tree`了解更多选项. (3认同)
  • 这也显示了所有使用`git rm --cached <file>`未跟踪的文件.这使得_commit_在这种情况下只是一个技术术语,并且显示一堆文件(作为提交的一部分)是完全误导的,因为Git不显示文件是否被添加或删除. (2认同)
  • 第一种方式不适用于合并提交,第二种方式. (2认同)
  • @ Eido95它(可能)是一些提交哈希的前八个字符.它可以是对提交的任何引用,例如标记,分支名称,完整的40个字符的哈希或"HEAD". (2认同)
  • @Colin或者,添加[-m`标志](https://git-scm.com/docs/git-diff-tree#git-diff-tree--m):`git diff-tree --no -commit-id --name-only -m -r bd61ad98`.这可能会提供非唯一的行 - 它将每个合并头中的文件与其他合并头分开列出.在类UNIX的平台上,如果这是一个问题,你可以在最后添加`| sort | uniq`. (2认同)
  • @VaTo的[this answer](/sf/answers/2688454541/)中建议的`git show --stat(hash)`,它的输出比您要求的要多,但易于记忆且完美如果您是人类而不是机器,那很好。在接受的答案中也许值得一提,以提供一种“易于键入”的替代方法。 (2认同)
  • @OhComeOn 瓷器命令被调整为对用户来说看起来不错。Git 开发人员可能会随时更改输出的布局(引入不同的格式,例如添加分隔符或使用额外的词来更好地描述等)。如果您解析该输出,您将来可能会遇到问题,因为您将脚本定制为该特定布局。但是,“管道”命令应该看起来相同,无论您使用的是什么 git 版本。 (2认同)

Jak*_*ski 226

如果要获取已更改文件的列表:

git diff-tree --no-commit-id --name-only -r <commit-ish>
Run Code Online (Sandbox Code Playgroud)

如果要获取提交中所有文件的列表,可以使用

git ls-tree --name-only -r <commit-ish>
Run Code Online (Sandbox Code Playgroud)

  • 传递`--no-commit-id`以避免打印SHA1,如下所示:`git diff-tree --no-commit-id --name-only -r <commit-ish>` (5认同)
  • @CoDEmanX:你没有错过添加`-r` /`-t`选项,是吗?因为diff-tree处理修改和添加的文件.如果要列出所有新的(添加的)文件,请使用`git diff-tree -r --name-only --no-commit-id --diff-filter = A <commit-ish>` (3认同)
  • 事实证明,参数的排序在这里很重要.您帖子中的那个不起作用,而您的回复*中的那个不起作用 - 至少在您更新帖子之前;) (2认同)

Han*_*Gay 211

我只是假设这gitk不是必需的.在那种情况下,试试吧git show --name-only <sha>.

  • - 在我需要它的大多数情况下,只有名字很多; 因此,赞成最短的解决方案(也是我在1次尝试时唯一记得的解决方案). (30认同)
  • 或者`--name-status`. (24认同)
  • 最短、最容易记住的答案。 (2认同)

Tux*_*ude 172

我个人使用--stat--onelineshow命令的组合:

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢/想要添加/删除统计信息,则可以使用--name-only替换--stat

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
Run Code Online (Sandbox Code Playgroud)

  • 这很棒!它基本上为您提供了Github在提交视图顶部显示的文件摘要.谢谢. (3认同)
  • 人们也可以创建一个git别名......例如,也许是`git config --global alias.changes'show --stat --oneline'.然后你可以输入`git changes`(带有一个可选的commit-ish)并获得上面第一个例子的输出. (3认同)
  • 很不错。要定义别名:`alias gits='git show --stat --oneline'`,然后`gits`本身显示最新的更改(在HEAD中),而`gits b24f5fb`可用于显示任何修订版本的更改。 (2认同)
  • 尼斯.与接受的答案不同,"git show"也适用于审查隐藏的更改:例如`git show --stat --oneline stash @ {1}` (2认同)

Ind*_*ath 71

你也可以

git log --name-only
Run Code Online (Sandbox Code Playgroud)

您可以浏览各种提交,提交消息和更改的文件.

输入q以获取提示.

  • 谢谢,有帮助。顺便说一句:使用 `git show 5944ad2a8b5 --name-only` 列出特定提交的名称 (3认同)
  • 喜欢。不错,很简单:D (2认同)

lun*_*dov 67

最近我需要在两次提交之间列出所有已更改的文件.所以我使用了这个(也是*nix特定的)命令

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq
Run Code Online (Sandbox Code Playgroud)

更新:或者正如Ethan在下面指出的那样

git diff --name-only START_COMMIT..END_COMMIT
Run Code Online (Sandbox Code Playgroud)

使用--name-status还将包括每个文件旁边的更改(添加,修改,删除等)

git diff --name-status START_COMMIT..END_COMMIT
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用`git diff --name-status START_COMMIT..END_COMMIT`那么你不需要尾随`| sort | uniq`. (4认同)
  • 刚试过:在Windows上的git bash也可以正常工作. (2认同)

VaT*_*aTo 59

最简单的形式:

git show --stat (hash)

这更容易记住,它将为您提供所需的所有信息.

如果您真的只想要文件的名称,可以添加--name-only选项.

git show --stat --name-only (hash)

  • --name-only仍将包含一些包含作者,日期和提交消息等信息的标题行. (2认同)

tak*_*hin 47

我经常使用更改的别名.设置:

git config --global alias.changed 'show --pretty="format:" --name-only'
Run Code Online (Sandbox Code Playgroud)

然后:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)
Run Code Online (Sandbox Code Playgroud)

类似的命令可能有用:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only
Run Code Online (Sandbox Code Playgroud)


vqu*_*ans 38

使用标准的git diff命令(也适用于脚本):

git diff --name-only <sha>^ <sha>
Run Code Online (Sandbox Code Playgroud)

如果您还想要更改文件的状态:

git diff --name-status <sha>^ <sha>
Run Code Online (Sandbox Code Playgroud)

这适用于合并提交.


Pra*_*790 37

列出特定提交上更改的文件:

git show --pretty=%gd --stat <commit_id>
Run Code Online (Sandbox Code Playgroud)

列出最近提交时更改的文件:

git show --pretty=%gd --stat
Run Code Online (Sandbox Code Playgroud)


alp*_*989 34

使用

git log --name-status
Run Code Online (Sandbox Code Playgroud)

这将显示提交ID,消息,更改的文件以及是否已修改,创建,添加或删除.有点一对一的命令.


Pat*_*otz 24

$ git log 88ee8^..88ee8 --name-only --pretty="format:"


Ole*_*rin 23

git show --name-only a303aa90779efdd2f6b9d90693e2cbbbe4613c1d
Run Code Online (Sandbox Code Playgroud)


Ali*_*eza 19

好的,有几种方法可以显示特定提交中的所有文件...

要减少信息并仅显示已提交文件的名称,您只需添加--name-only--name-status标记...,这些标志只显示与您之前提交的文件名不同的文件名...

所以你可以用git diff后面的--name-only两个提交哈希来做<sha0> <sha1>,如下所示:

git diff --name-only 5f12f15 kag9f02 
Run Code Online (Sandbox Code Playgroud)

我还创建了下面的图像,以显示在这些情况下要经历的所有步骤:

git diff --name-only 5f12f15 kag9f02


Pio*_*rak 17

我用它来获取合并提交中更改的文件列表

\n
\xce\xbb git log -m -1 --name-only --pretty="format:"\nconfigs/anotherconfig.xml\nconfigs/configsInRepo.xml\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
\xce\xbb git log -m -1 --name-status --pretty="format:"\nA       configs/anotherconfig.xml\nM       configs/configsInRepo.xml\n
Run Code Online (Sandbox Code Playgroud)\n


小智 15

我用它来获取两个变更集之间的修改文件列表:

git diff --name-status <SHA1> <SHA2> | cut -f2
Run Code Online (Sandbox Code Playgroud)

  • 使用`--name-only`,你可以跳过`cut`命令 (5认同)

Mic*_*lva 14

我喜欢用

git show --stat <SHA1>^..<SHA2>
Run Code Online (Sandbox Code Playgroud)


Koe*_*en. 13

还有git whatchanged,这比水平更低git log

NAME
       git-whatchanged - Show logs with difference each commit introduces
Run Code Online (Sandbox Code Playgroud)

它输出提交摘要及其下面的文件列表及其模式,如果有,则添加(A),删除(D)或修改(M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363
Run Code Online (Sandbox Code Playgroud)

会给出类似的东西:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...
Run Code Online (Sandbox Code Playgroud)

我知道这个答案并没有真正匹配"没有多余的信息."但我仍然认为这个列表比文件名更有用.


ski*_*ppy 11

我喜欢这个:

git diff --name-status <SHA1> <SHA1>^
Run Code Online (Sandbox Code Playgroud)


小智 11

如果您只想在上次提交中更改文件列表,请使用简单的一行命令:

git diff HEAD~1 --name-only
Run Code Online (Sandbox Code Playgroud)


Jig*_*sar 11

尝试使用此命令获取名称并更改行数

git show --stat <commit-hash>
Run Code Online (Sandbox Code Playgroud)

只显示文件名

git show --stat --name-only  <commit-hash>
Run Code Online (Sandbox Code Playgroud)

获取最后的提交哈希,然后尝试此命令

git log -1
Run Code Online (Sandbox Code Playgroud)

带有显示文件名和文件状态的最后提交修改,创建或删除

 git log -1 --oneline --name-status <commit-hash>
Run Code Online (Sandbox Code Playgroud)

或全部

git log
Run Code Online (Sandbox Code Playgroud)

有关更高级的git日志信息,请阅读本文

https://devhints.io/git-log-format

https://devhints.io/git-log

  • @DanFare“致命:无法识别的参数:--names-only”来自 2.20.1.windows.1 (2认同)

use*_*409 10

也许我错过了有人提到如果你想使用“log”命令来增加日志 x 以前的提交以包含受影响的文件的名称,然后在末尾添加 --name-only 。

所以:

git log -n3
Run Code Online (Sandbox Code Playgroud)

查看最近 3 次提交的最后评论。

git log -n3 --name-only
Run Code Online (Sandbox Code Playgroud)

查看最近 3 次提交中生效的注释和文件。


小智 8

显示日志.

COMMIT可以为空("")或sha-1或sha-1缩短.

git log COMMIT -1 --name-only
Run Code Online (Sandbox Code Playgroud)

这将仅列出文件,对进一步处理非常有用.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"
Run Code Online (Sandbox Code Playgroud)


New*_*onx 8

列出提交中更改的文件:

git diff --name-only SHA1^ SHA1
Run Code Online (Sandbox Code Playgroud)

这不显示日志消息,额外换行符或任何其他混乱.这适用于任何提交,而不仅仅是当前提交.不知道为什么它没有相当尚未提及,所以我将它添加.


Ija*_*han 8

找到了一个完美的答案:

git show --name-status --oneline <commit-hash>
Run Code Online (Sandbox Code Playgroud)

所以我可以知道

which files were just modified M

Which files were newly added , A

Which files were deleted , D
Run Code Online (Sandbox Code Playgroud)


use*_*284 7

只有文件列表(甚至没有提交消息):

git show --name-only --pretty=format:
Run Code Online (Sandbox Code Playgroud)

例如,在编辑器中打开所有更改的文件:

git show --name-only --pretty=format: | xargs "$EDITOR"
Run Code Online (Sandbox Code Playgroud)


sea*_*ges 5

" git show --stat"(感谢Ryan)和一些sed命令的组合应该为您修剪数据:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"
Run Code Online (Sandbox Code Playgroud)

这将只生成修改过的文件列表.


src*_*der 5

有一个简单的技巧可以作为文件列表查看,只需:在哈希后添加即可.

git show 9d3a52c474:
Run Code Online (Sandbox Code Playgroud)

然后你可以钻进来,

git show 9d3a52c474:someDir/someOtherDir
Run Code Online (Sandbox Code Playgroud)

如果您点击文件,您将获得该文件的原始版本; 如果你只是寻找一个很好的参考或关键代码片段(差异可以使一切变得一团糟),有时你会想要的,

git show 9d3a52c474:someDir/someOtherDir/somefile
Run Code Online (Sandbox Code Playgroud)

这种方法的唯一缺点是它不容易显示文件树.