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

Philip Fourie 2619 git git-show

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

我试过了:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

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

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

Ryan McGeary.. 3498

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

$ 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).
  • --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/ask/17360801/)中建议的`git show --stat(hash)`,它的输出比您要求的要多,但易于记忆且完美如果您是人类而不是机器,那很好。在接受的答案中也许值得一提,以提供一种“易于键入”的替代方法。 (2认同)

Jakub Narębs.. 226

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

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

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

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

  • 传递`--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认同)

Hank Gay.. 211

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

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

Tuxdude.. 172

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

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

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

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

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

Indu Devanat.. 71

你也可以

git log --name-only

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

输入q以获取提示.

  • 喜欢。不错,很简单:D (2认同)

lunohodov.. 67

最近我需要在两次提交之间列出所有已更改的文件.所以我使用了这个(也是*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

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

VaTo.. 59

最简单的形式:

git show --stat (hash)

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

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

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

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

takeshin.. 47

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

git config --global alias.changed 'show --pretty="format:" --name-only'

然后:

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)

类似的命令可能有用:

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


vquintans.. 38

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

git diff --name-only <sha>^ <sha>

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

git diff --name-status <sha>^ <sha>

这适用于合并提交.


alpha_989.. 34

使用

git log --name-status

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


Pat Notz.. 24

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


Alireza.. 19

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

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

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

git diff --name-only 5f12f15 kag9f02 

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

git diff --name-only 5f12f15 kag9f02


小智.. 15

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

git diff --name-status <SHA1> <SHA2> | cut -f2

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

Michael De S.. 14

我喜欢用

git show --stat <SHA1>^..<SHA2>


Koen... 13

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

NAME
       git-whatchanged - Show logs with difference each commit introduces

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

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

会给出类似的东西:

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
...

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


skiphoppy.. 11

我喜欢这个:

git diff --name-status <SHA1> <SHA1>^


小智.. 11

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

git diff HEAD~1 --name-only


Jignesh Jois.. 11

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

git show --stat <commit-hash>

只显示文件名

git show --stat --name-only  <commit-hash>

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

git log -1

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

 git log -1 --oneline --name-status <commit-hash>

或全部

git log

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

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

https://devhints.io/git-log


小智.. 8

显示日志.

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

git log COMMIT -1 --name-only

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

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"


Newtonx.. 8

列出提交中更改的文件:

git diff --name-only SHA1^ SHA1

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


Ijaz Ahmad K.. 8

找到了一个完美的答案:

git show --name-status --oneline <commit-hash>

所以我可以知道

which files were just modified M

Which files were newly added , A

Which files were deleted , D


seanhodges.. 5

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

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

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


srcspider.. 5

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

git show 9d3a52c474:

然后你可以钻进来,

git show 9d3a52c474:someDir/someOtherDir

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

git show 9d3a52c474:someDir/someOtherDir/somefile

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


归档时间:

查看次数:

1380216 次

最近记录:

6 月 前