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


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

我努力了:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

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

还有另一个吗? git 命令只提供我想要的列表,这样我就可以避免从中解析它 git show 输出?


2179
2018-01-08 12:26


起源


我来这里寻找的东西有点不同。我希望看到所有文件都被修改为一组提交并使用了 git log --until 2013-05-21 --pretty="short" --name-only 效果很好。 - Limited Atonement
使用此命令可以获取之前的所有更改 n 承诺到 master: git diff-tree --name-status -r @{3} master - ako


答案:


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

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

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

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • --no-commit-id 抑制提交ID输出。
  • --pretty 参数指定一个空格式字符串,以避免开头的瑕疵。
  • --name-only 参数仅显示受影响的文件名(Thanks Hank)。
  • -r 参数是递归到子树

2866
2018-01-08 13:02



不应在脚本中使用瓷器命令(git help)。请用 git diff-tree --no-commit-id --name-only -r <commit> 代替 - drizzt
应当指出的是 diff-tree 查看根提交时将无法工作。 - jbranchaud
替换 --name-only 选项 --name-status 会给出更清晰的总结。 - Kurt Zhong
如果您希望它在根提交上工作,请使用--root标志。从手册页:“当指定--root时,初始提交将显示为一个大的创建事件。这相当于针对NULL树的差异。” - Chris
git log --name-only -n 1 <hash> 最后一次提交将是: git log --name-only -n 1 HEAD~1..HEAD - Kurt


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

git diff-tree --no-commit-id --name-only -r <commit-ish>

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

git ls-tree --name-only -r <commit-ish>

189
2018-01-14 19:22



仅使用--name-only的ls-tree似乎不适用于1.6.4.4或1.6.3.3。你觉得这是个bug吗? - krosenvold
事实证明,参数的排序在这里很重要。你帖子中的那个不起作用,而你的帖子中的那个不起作用 不 工作 - 至少在你更新帖子之前;) - krosenvold
通过 --no-commit-id 避免打印SHA1,如下所示: git diff-tree --no-commit-id --name-only -r <commit-ish> - John Mellor
@CoDEmanX:你没有错过添加 -r / -t 选项,是吗?因为diff-tree处理修改和添加的文件。如果要列出所有新(添加)的文件,请使用 git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish> - Jakub Narębski
这不应该是微不足道的吗? - Niklas Rosencrantz


我会假设的 gitk 不希望如此。在那种情况下,试试吧 git show --name-only <sha>


180
2018-01-08 12:34



- 在我需要它的大多数情况下,只有名字很多;因此,赞成最短的解决方案(也是我在1次尝试时唯一记得的解决方案)。 - Erik S
要么 --name-status。 - Neil Traft
gitk 正是我所追求的 - 谢谢。这个问题现在是谷歌搜索中出现的第一件事,所以值得人们知道 gitk 存在!其他人可以保持你的命令行;我只看一下那个漂亮的UI屏幕:) - Mr Spoon
作为一个真正喜欢CLI git的人, gitk 实际上是查看文件和显示diff所在文件的一种不错的方法。例如代码审查来自对等方的怪物提交。 - Elijah Lynn


我个人使用的组合 --stat 和 - 一条线 随着 显示 命令:

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

如果您不喜欢/想要添加/删除统计数据,则可以替换 --stat 同 --name只

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

114
2017-07-11 23:21



这很棒!它基本上为您提供了Github在提交视图顶部显示的文件摘要。谢谢。 - trisweb
非常好。要定义别名: alias gits='git show --stat --oneline', 然后 gits 它本身显示了最新的变化(在HEAD中) gits b24f5fb 可用于显示任何修订的更改。 - Brent Faust
还可以创建一个git别名......例如也许 git config --global alias.changes 'show --stat --oneline'。然后你可以输入 git changes (使用可选的commit-ish)并获取上面第一个示例的输出。 - lindes
Git for Windows需要双引号: git config --global alias.changes "show --stat --oneline" - Alchemistmatt
尼斯。与接受的答案不同, git show 也适用于审查隐藏的更改:例如 git show --stat --oneline stash@{1} - Jeff Ward


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

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

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

git diff --name-only START_COMMIT..END_COMMIT

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

git diff --name-status START_COMMIT..END_COMMIT

58
2018-04-26 12:23



刚尝试过:在Windows上的git bash中运行正常。 - OregonGhost
如果你使用 git diff --name-status START_COMMIT..END_COMMIT 那你就不需要尾随了 |sort | uniq。 - Ethan
以上评论的更正: git diff --name-only START_COMMIT..END_COMMIT - Ethan
这就是我想要的。我是如何使用它的: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'。我想要一个代码更改列表,仅用于添加了数千个PNG和XML布局的巨大PR。 - AutonomousApps


你也可以这样做

git log --name-only

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

输入q以获取提示。


56
2018-05-27 01:20





最简单的形式:

git show --stat (hash)

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

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

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


48
2017-07-16 00:06



我想知道为什么如果我的答案简单而正确,我会投反对票。 - VaTo
如果我冒险猜测(我只是猜测,因为不是我拒绝投票你的答案),这是因为原始海报只要求一个文件列表,没有任何其他信息。您提供的命令显示有关提交的信息以及对文件所做的更改类型。如果有任何安慰,我发现你的答案对别的东西很有用。 - J. Gregory Wright
@ J.GregoryWright你可能是对的,在这种情况下我会添加--name-only,就是这样。但是,我使用我提供的命令,因为它更容易记住。但我会把这两个选项放在以防万一,谢谢你的建议! - VaTo
--name-only仍将包含一些包含作者,日期和提交消息等信息的标题行。 - devoured elysium
最好的答案IMO,其他人根本不值得回忆。 - Amalgovinus