【问题标题】:How do I list all of the files in a commit?如何列出提交中的所有文件?
【发布时间】:2021-10-08 17:35:10
【问题描述】:

我正在寻找一个简单的 Git 命令,该命令提供格式良好的所有文件列表,这些文件是由哈希 (SHA-1) 给出的提交的一部分,没有无关信息。

我试过了:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

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

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

【问题讨论】:

  • 我来这里是为了寻找一些不同的东西。我想查看为一组提交修改的所有文件,并使用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 - 列出当前分支上所有更改的文件,与主分支相比。

标签: git git-show


【解决方案1】:

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

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

列出在最近提交中更改的文件:

git show --pretty=%gd --stat

【讨论】:

    【解决方案2】:

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

    λ 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
    

    【讨论】:

      【解决方案3】:

      试试这个命令的名字和改变行数

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

      【讨论】:

      • @DanFare "fatal: unrecognized argument: --names-only" from 2.20.1.windows.1
      【解决方案4】:

      使用

      git log --name-status
      

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

      【讨论】:

      • 这会显示最近提交的大量列表,我必须按住 ENTER 按钮才能查看所有内容,然后它会锁定我的 cmd。不用了。
      【解决方案5】:

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

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

      让我知道

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

      • 新增了哪些文件(A)

      • 哪些文件被删除(D)

      【讨论】:

        【解决方案6】:

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

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

        所以你可以在git diff 后面跟着--name-only,在&lt;sha0&gt; &lt;sha1&gt; 后面加上两个提交哈希。如下所示:

        git diff --name-only 5f12f15 kag9f02
        

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

        【讨论】:

          【解决方案7】:

          还有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 而不是提供参数。
          【解决方案8】:

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

          git show 9d3a52c474:
          

          然后你就可以钻进去了,

          git show 9d3a52c474:someDir/someOtherDir
          

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

          git show 9d3a52c474:someDir/someOtherDir/somefile
          

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

          【讨论】:

          • 它不仅会查找提交中更改的文件,还会查找该提交树中的所有文件。如果您愿意,那就太好了,但如果您想查看哪些文件发生了变化,那就不是太好了。
          【解决方案9】:

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

          git diff HEAD~1 --name-only
          

          【讨论】:

            【解决方案10】:

            我经常使用 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
            

            【讨论】:

            • “变”有什么特别之处吗?它是一个词的任意选择吗?大会?内置的东西?
            【解决方案11】:

            列出提交中更改的文件:

            git diff --name-only SHA1^ SHA1
            

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

            【讨论】:

            • 这两个看起来一样:git diff SHA1^ SHA1git show SHA1
            • @mrW 这些命令产生类似的输出,但git show 也显示提交消息
            【解决方案12】:

            显示日志。

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

            git log COMMIT -1 --name-only
            

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

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

            【讨论】:

              【解决方案13】:

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

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

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

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

              这适用于合并提交。

              【讨论】:

              • 感谢您提供适用于合并提交的变体!
              【解决方案14】:

              最近我需要列出两次提交之间的所有更改文件。所以我使用了这个(也是 *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 的代码更改列表。
              【解决方案15】:

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

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

              【讨论】:

              • 是的,但是状态可以非常方便(例如,您可能希望使用 grep 显示所有文件,除了那些已被删除的文件,例如 git diff --name-status .. | grep ^[^D] | cut -f2
              【解决方案16】:

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

              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 &lt;commit-ish&gt;
              • diff-tree 不返回任何内容,可能是因为我引用的提交添加了文件,但没有更改任何现有文件。 ls-tree 为我提供了 repo 中所有文件的列表,而不仅仅是上次提交中添加/更改的文件。我想知道是否有第三个命令只列出所有 new 文件(即在给定的提交中添加)?
              • @CoDEmanX :您没有错过添加-r / -t 选项,是吗?因为 diff-tree 处理修改和添加的文件。如果要列出所有新(添加)文件,请使用 git diff-tree -r --name-only --no-commit-id --diff-filter=A &lt;commit-ish&gt;
              【解决方案17】:

              我只是假设 gitk 不适合这个。在这种情况下,请尝试git show --name-only &lt;sha&gt;

              【讨论】:

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

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

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

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

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

              【讨论】:

              • 这很好用,但是它只显示最后一次提交。如果您想针对特定提交,请参阅@Ryan McGeary 的回答
              • @Hamfri:不,它不仅适用于最后一次提交。这只是git show 的默认值。
              【解决方案19】:

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

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

              【讨论】:

                【解决方案20】:

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

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

                另一种方式(不太适合脚本,因为它是一个 porcelain 命令;意味着面向用户)

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

                • --no-commit-id 抑制提交 ID 输出。
                • --pretty 参数指定了一个空的格式字符串,以避免开头出现杂乱无章的情况。
                • --name-only 参数仅显示受影响的文件名(感谢 Hank)。如果您想查看每个文件(D删除、M修改、Added)发生了什么,请改用--name-status
                • -r 参数是递归到子树中

                【讨论】:

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

                我个人将 --stat--onelineshow 命令结合使用:

                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 ”不同,使用此命令我也可能会在合并中看到受影响的文件!谢谢!
                【解决方案22】:

                最简单的形式:

                git show --stat (hash)

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

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

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

                【讨论】:

                • --name-only 仍将包含几个标题行,其中包含作者、日期和提交消息等信息。
                【解决方案23】:

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

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

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

                【讨论】:

                  【解决方案24】:
                  git show HEAD@{0}
                  

                  适合我

                  【讨论】:

                  • All:需要解释一下。为什么以及如何工作?
                  【解决方案25】:

                  你也可以这样做

                  git log --name-only
                  

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

                  键入 q 以获取您的提示。

                  【讨论】:

                  • 谢谢,有帮助。顺便说一句:使用git show 5944ad2a8b5 --name-only 列出特定提交的名称
                  • 与离开--name-only相比有什么区别?或者换句话说,它应该做什么以及它如何回答问题?
                  • 简短易记。
                  【解决方案26】:

                  我喜欢用

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

                  【讨论】:

                    【解决方案27】:

                    我喜欢这个:

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

                    【讨论】:

                    • 我认为这会使AD(添加和删除)文件状态倒退,因为它显示了从指定提交到上一个提交的差异,而不是相反。应该是git diff --name-status &lt;SHA1&gt;^ &lt;SHA1&gt;
                    【解决方案28】:
                    $ git log 88ee8^..88ee8 --name-only --pretty="format:"

                    【讨论】:

                    • 解释一下。
                    猜你喜欢
                    • 1970-01-01
                    • 2022-06-29
                    • 2011-04-11
                    • 1970-01-01
                    • 2021-07-08
                    • 2015-09-11
                    相关资源
                    最近更新 更多