当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何列出提交中的所有文件?》经验,为你挑选了23个好方法。

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

我试过了:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

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

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



1> Ryan McGeary..:

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

$ 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`选项将给出更清晰的摘要.
应该注意,查看根提交时,`diff-tree`将不起作用.
`git log --name-only -n 1 `最后一次提交是:`git log --name-only -n 1 HEAD~1..HEAD`
如果您希望它在根提交上工作,请使用--root标志.从手册页:"当指定--root时,初始提交将显示为一个大的创建事件.这相当于对NULL树的差异."
如果有人想知道(就像我一样)为什么第一种方式是"首选",那么它可以追溯到@drizzt的评论; `git show`是"瓷器"(意思是面向用户)和`git diff-tree`是"plumbing"(意味着以编程方式使用,例如来自脚本).前者的接口可能会随着时间的推移而改变(因此git维护者可能会因为可用性原因而丢弃`--name-only`,尽管我不认为他们会出现这种情况),而后者的接口将尽可能保持稳定兼容性原因.
这不适用于合并提交.消息:`将bitbucket.org:xxx/xxx的分支''合并到master`中
@ user1598390 -r recurses into sub-trees.您可以通过`man git-diff-tree`了解更多选项.
这也显示了所有使用`git rm --cached `未跟踪的文件.这使得_commit_在这种情况下只是一个技术术语,并且显示一堆文件(作为提交的一部分)是完全误导的,因为Git不显示文件是否被添加或删除.
第一种方式不适用于合并提交,第二种方式.
@ Eido95它(可能)是一些提交哈希的前八个字符.它可以是对提交的任何引用,例如标记,分支名称,完整的40个字符的哈希或"HEAD".
@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`.
@VaTo的[this answer](/sf/ask/17360801/)中建议的`git show --stat(hash)`,它的输出比您要求的要多,但易于记忆且完美如果您是人类而不是机器,那很好。在接受的答案中也许值得一提,以提供一种“易于键入”的替代方法。

2> Jakub Narębs..:

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

git diff-tree --no-commit-id --name-only -r 

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

git ls-tree --name-only -r 


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

3> Hank Gay..:

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


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

4> Tuxdude..:

我个人使用--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在提交视图顶部显示的文件摘要.谢谢.
人们也可以创建一个git别名......例如,也许是`git config --global alias.changes'show --stat --oneline'.然后你可以输入`git changes`(带有一个可选的commit-ish)并获得上面第一个例子的输出.
尼斯.与接受的答案不同,"git show"也适用于审查隐藏的更改:例如`git show --stat --oneline stash @ {1}`

5> Indu Devanat..:

你也可以

git log --name-only

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

输入q以获取提示.


喜欢。不错,很简单:D

6> lunohodov..:

最近我需要在两次提交之间列出所有已更改的文件.所以我使用了这个(也是*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`.
刚试过:在Windows上的git bash也可以正常工作.

7> VaTo..:

最简单的形式:

git show --stat (hash)

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

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

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


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

8> takeshin..:

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

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



9> vquintans..:

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

git diff --name-only ^ 

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

git diff --name-status ^ 

这适用于合并提交.



10> alpha_989..:

使用

git log --name-status

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



11> Pat Notz..:
$ git log 88ee8^..88ee8 --name-only --pretty="format:"



12> Alireza..:

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

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

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

git diff --name-only 5f12f15 kag9f02 

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

git diff --name-only 5f12f15 kag9f02



13> 小智..:

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

git diff --name-status   | cut -f2


使用`--name-only`,你可以跳过`cut`命令

14> Michael De S..:

我喜欢用

git show --stat ^..



15> Koen...:

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

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

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

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

会给出类似的东西:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx 
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
...

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



16> skiphoppy..:

我喜欢这个:

git diff --name-status  ^



17> 小智..:

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

git diff HEAD~1 --name-only



18> Jignesh Jois..:

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

git show --stat 

只显示文件名

git show --stat --name-only  

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

git log -1

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

 git log -1 --oneline --name-status 

或全部

git log

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

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

https://devhints.io/git-log



19> 小智..:

显示日志.

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

git log COMMIT -1 --name-only

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

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



20> Newtonx..:

列出提交中更改的文件:

git diff --name-only SHA1^ SHA1

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



21> Ijaz Ahmad K..:

找到了一个完美的答案:

git show --name-status --oneline 

所以我可以知道

which files were just modified M

Which files were newly added , A

Which files were deleted , D



22> seanhodges..:

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

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

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



23> srcspider..:

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

git show 9d3a52c474:

然后你可以钻进来,

git show 9d3a52c474:someDir/someOtherDir

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

git show 9d3a52c474:someDir/someOtherDir/somefile

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有