ChatGPT解决这个技术问题 Extra ChatGPT

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

如何打印属于给定提交的所有文件的普通列表?

尽管以下列出了这些文件,但它还包含每个文件的不需要的差异信息:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d
我来这里是为了寻找一些不同的东西。我想查看为一组提交修改的所有文件,并使用 git log --until 2013-05-21 --pretty="short" --name-only 结束,效果很好。
使用此命令获取从之前的 n 提交到 master 的所有更改:git diff-tree --name-status -r @{3} master
git diff --name-only master - 列出当前分支上所有更改的文件,与主分支相比。
您可以查看此答案:stackoverflow.com/questions/17563726/…

R
Robin Wieruch

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

$ 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 参数仅显示受影响的文件名(感谢 Hank)。如果您想查看每个文件(已删除、已修改、已添加)发生了什么,请改用 --name-status

-r 参数是递归到子树


应该注意的是,在查看根提交时,diff-tree 不起作用。
--name-only 选项替换为 --name-status 将提供更清晰的摘要。
如果您希望它在根提交上工作,请使用 --root 标志。从手册页:“当指定 --root 时,初始提交将显示为一个大的创建事件。这相当于针对 NULL 树的差异。”
git log --name-only -n 1 <hash> 最后一次提交是:git log --name-only -n 1 HEAD~1..HEAD
如果有人想知道(就像我一样)为什么第一种方式是“首选”,它可以追溯到@drizzt 的评论; git show 是“瓷器”(意味着面向用户),而 git diff-tree 是“管道”(意味着以编程方式使用,例如从脚本中使用)。前者的界面可能会随着时间而改变(因此 git 维护者可能会放弃 --name-only,尽管我不认为他们)出于可用性原因,而后者的界面将保持稳定尽可能出于兼容性原因。
P
Peter Mortensen

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

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

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

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

带有 --name-only 的 ls-tree 似乎不适用于 1.6.4.4 或 1.6.3.3。你认为这是一个错误吗?
事实证明,参数的顺序在这里很重要。您帖子中的那个不起作用,而您回复中的那个起作用 - 至少在您更新您的帖子之前;)
通过 --no-commit-id 以避免打印 SHA1,如下所示:git diff-tree --no-commit-id --name-only -r <commit-ish>
diff-tree 不返回任何内容,可能是因为我引用的提交添加了文件,但没有更改任何现有文件。 ls-tree 为我提供了 repo 中所有文件的列表,而不仅仅是上次提交中添加/更改的文件。我想知道是否有第三个命令来列出所有新文件(即添加到给定的提交中)?
@CoDEmanX:您没有错过添加 -r / -t 选项,是吗?因为 diff-tree 处理修改和添加的文件。如果您想列出所有新的(添加的)文件,请使用 git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
P
Peter Mortensen

我只是假设这不需要 gitk。在这种情况下,请尝试 git show --name-only <sha>


--name-only 在我需要的大多数情况下就足够了;因此,赞成最短的解决方案(也是我在 1 次尝试中记住的唯一解决方案)。
作为真正喜欢 CLI git 的人,gitk 实际上是查看文件并显示差异所在文件的一种不错的方式。例如,审查来自同行的怪物提交的代码。
要记住的最短和最容易的答案。
m
m13r

我个人将 --stat 和 --oneline 与 show 命令结合使用:

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

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

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

非常好。要定义别名:alias gits='git show --stat --oneline',然后 gits 本身显示最新更改(在 HEAD 中),而 gits b24f5fb 可用于显示任何修订的更改。
也可以创建一个 git 别名...例如 git config --global alias.changes 'show --stat --oneline'。然后您可以键入 git changes(带有可选的 commit-ish)并从上面的第一个示例中获取输出。
Git for Windows 需要双引号:git config --global alias.changes "show --stat --oneline"
好的。与公认的答案不同,git show 也适用于查看隐藏的更改:例如 git show --stat --oneline stash@{1}
这是我真正需要的!与“ git diff-tree --name-status -r ”不同,使用此命令我也可能会在合并中看到受影响的文件!谢谢 !
I
Indu Devanath

你也可以做

git log --name-only

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

键入 q 以获取您的提示。


谢谢,它有帮助。顺便说一句:使用 git show 5944ad2a8b5 --name-only 列出特定提交的名称
与省略 --name-only 相比有什么区别?或者换句话说,它应该做什么以及它如何回答这个问题?
简短易记。
P
Peter Mortensen

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

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

或作为 Ethan points out

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
更正上述评论:git diff --name-only START_COMMIT..END_COMMIT
这就是我一直在寻找的。我如何使用它:git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'。我只想要一个添加了数千个 PNG 和 XML 布局的巨大 PR 的代码更改列表。
V
VaTo

最简单的形式:

git show --stat (hash)

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

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

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


--name-only 仍将包含几个标题行,其中包含作者、日期和提交消息等信息。
P
Peter Mortensen

我经常使用 changed alias。要设置它:

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

“变”有什么特别之处吗?它是一个词的任意选择吗?大会?内置的东西?
P
Peter Mortensen

利用

git log --name-status

这将向您显示提交 ID、消息、更改的文件以及是否已修改、创建、添加或删除。有点像一个多合一的命令。


这会显示每个最近提交的巨大列表,我必须按住 ENTER 按钮才能查看所有内容,然后它会锁定我的 cmd。不,谢谢。
P
Peter Mortensen

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

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

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

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

这适用于合并提交。


感谢您提供适用于合并提交的变体!
P
Peter Mortensen

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

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 日志信息,请阅读以下文章:

Git 日志格式字符串备忘单

git log 备忘单


@DanFare “致命:无法识别的参数:--names-only”来自 2.20.1.windows.1
“for all”...只是 git log 没有给您文件名...
P
Prakash26790

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

git show --pretty=%gd --stat <commit_id>

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

git show --pretty=%gd --stat

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

一个解释将是有序的。
P
Peter Mortensen

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

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

因此,您可以在 git diff 之后执行 --name-only,在 <sha0> <sha1> 之后使用两个提交哈希。如下所示:

git diff --name-only 5f12f15 kag9f02

我还创建了下图来显示在这些情况下要执行的所有步骤:

https://i.stack.imgur.com/dxHRm.png


P
Peter Mortensen

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

git diff HEAD~1 --name-only

P
Peter Mortensen

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

我知道这个答案并不真正匹配“没有无关信息。”,但我仍然认为这个列表比文件名更有用。


另外,只需一个命令 whatchanged 而不是提供参数。
P
Peter Mortensen

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

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

或者

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

P
Peter Mortensen

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

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

是的,但状态可以非常方便(例如,您可能希望 grep 显示所有文件,除了那些已被删除的文件,例如 git diff --name-status .. | grep ^[^D] | cut -f2
M
Michael De Silva

我喜欢用

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

P
Peter Mortensen

我找到了一个完美的答案:

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

这样我就可以知道

哪些文件刚刚被修改(M)

新增了哪些文件(A)

删除了哪些文件 (D)


s
skiphoppy

我喜欢这个:

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

我认为这得到了 A & D(添加和删除)文件状态向后,因为它显示了从指定提交到上一次提交的差异,而不是相反。它应该是 git diff --name-status <SHA1>^ <SHA1>
P
Peter Mortensen

显示日志。

COMMIT 可以是空白 ("")、SHA-1 哈希或 SHA-1 哈希的缩短版本。

git log COMMIT -1 --name-only

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

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

P
Peter Mortensen

列出提交中更改的文件:

git diff --name-only SHA1^ SHA1

这不会显示日志消息、额外的换行符或任何其他混乱。这适用于任何提交,而不仅仅是当前提交。


这两个看起来相同:git diff SHA1^ SHA1git show SHA1
@mrW 这些命令产生类似的输出,但 git show 也显示提交消息
u
user2394284

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

git show --name-only --pretty=format:

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

git show --name-only --pretty=format: | xargs "$EDITOR"

这完美地工作,但它只显示最后一次提交。如果您想针对特定提交,请参阅@Ryan McGeary 的回答
@Hamfri:不,它不仅适用于最后一次提交。它只是 git show 的默认值。
S
Surya

git show --stat”(感谢 Ryan)和几个 sed 命令的组合应该会为您修剪数据:

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

这将只生成已修改文件的列表。


P
Peter Mortensen

有一个简单的技巧可以将其视为文件列表。只需在哈希后添加 :

git show 9d3a52c474:

然后你可以钻进去,

git show 9d3a52c474:someDir/someOtherDir

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

git show 9d3a52c474:someDir/someOtherDir/somefile

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


它不仅会查找提交中更改的文件,还会查找该提交树中的所有文件。如果您愿意,那就太好了,但如果您想查看哪些文件发生了变化,那就不是太好了。
M
Mendi Barel

列出提交树中的所有文件:

git ls-tree --name-only --full-tree a21e610

S
Surya
git show HEAD@{0}

对我来说很好


全部:需要解释一下。为什么以及如何工作?
O
Oleg Kokorin
git show --name-only a303aa90779efdd2f6b9d90693e2cbbbe4613c1d