【问题标题】:How to get a list of changed files between revisions in a git repository?如何获取 git 存储库中修订之间的更改文件列表?
【发布时间】:2021-02-12 19:21:43
【问题描述】:

我需要获取从初始提交到最新提交的所有更改文件的列表。

所以,这是我的情况:

$ git init .
$ echo "test1" > test1
$ git add test1
$ git commit -m "test 1" 
$ echo "test2" > test2
$ git add test2
$ git commit -m "test 2"
$ echo "test3" > test3
$ git add test3
$ git commit -m "test 3"

$ git log 
commit 13b72d5468dfbb9582ad4d225cf1e6e8bb17f1bc (HEAD -> master)
Author: carlspring <...>
Date:   Fri Feb 12 18:58:58 2021 +0000

    test 3

commit 6955a875fdf57efaa3859827b7f975fa26095d38
Author: carlspring <...>
Date:   Fri Feb 12 18:58:56 2021 +0000

    test 2

commit 9410cf6a98986794c8ffe38c15cc60eaa054705c
Author: carlspring <...>
Date:   Fri Feb 12 18:58:56 2021 +0000

    test 1
carlspring@carlspring:/tmp/test$ git log --all --full-history --pretty=%H
13b72d5468dfbb9582ad4d225cf1e6e8bb17f1bc
6955a875fdf57efaa3859827b7f975fa26095d38
9410cf6a98986794c8ffe38c15cc60eaa054705c

我想获得一个列表,该列表生成自第一次提交以来所有更改的文件,如下所示:

test1
test2
test3

现在,我显然已经在这里看到了所有推荐使用git diff-tree 的答案,所以尝试了一下:

$ git diff-tree --no-commit-id --name-only -r 9410cf6a98986794c8ffe38c15cc60eaa054705c..HEAD
test2
test3

为什么也没有收到test1

【问题讨论】:

  • test1 已经是第一次提交的一部分,因此它不是“在第一次提交和 HEAD 之间”更改的文件。您可以从一开始的空提交开始,然后在单独的提交中添加 test1,然后它就会显示出来。
  • @JoachimSauer:嗯,这最终将针对具有实际历史记录的存储库执行。在这种情况下,人们会怎么做呢?
  • 您可以只创建一个没有父级的新空提交,因为这仅比较 tree 对象,所以不应该关心两者不共享任何历史记录。因此,您的合成空提交可以与 HEAD 进行比较,它将列出所有不同的文件(根据定义,这将是 HEAD 中的所有文件)。
  • 对于决定将其作为副本关闭的人:实际上并非如此。您链接到的答案显示了差异,而不是所有已更改文件的列表。

标签: git


【解决方案1】:

你应该可以通过使用 git empty tree id 来做到这一点:

$ git diff --name-only  4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD
test1
test2
test3

【讨论】:

  • @carlspring 它很短而且很重要;但是你说真正的仓库会有历史记录,在那种情况下,这不会列出你的提交更改的文件
  • 我不确定我是否遵循您所说的@MarkAdelsberger。它列出了初始提交之前的更改文件列表和当前HEAD。看起来这是根据给定示例所需要的。 :)
  • @tftd 我的意思是 OP 写了一条评论,他们说另一种等效的解决方案将不起作用,因为“这最终将针对具有实际历史记录的存储库执行”。您提供的内容没有显示变化;它显示了最终提交的全部内容。
  • git commit --allow-empty 如@Joachim 建议的那样与git diff --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD 不同。第一个命令实际上会创建一个提交,而第二个不会。至于引用的评论,我觉得您可能误解了它。当你有一个现有的仓库时,你会如何start with an empty commit at the very start and add test1 in a separate commit?它只适用于新创建的存储库?我的理解基于示例,该示例表明他想要更改文件的完整列表empty tree..HEAD。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2016-06-24
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多