如何让 git 显示正在跟踪的文件列表?

Posted

技术标签:

【中文标题】如何让 git 显示正在跟踪的文件列表?【英文标题】:How can I make git show a list of the files that are being tracked? 【发布时间】:2013-03-14 11:17:58 【问题描述】:

使用命令行 git,如何让 git 显示存储库中正在跟踪的文件的列表?

【问题讨论】:

List files in local git repo? 的可能重复项 我相信是的。但是当这有更好的答案时,将其标记为 dup 感觉不对。 在平行宇宙中,this question 包含所有答案,但每个答案都有自己独特的风格,这真是不可思议。 【参考方案1】:

在现有答案的基础上,您可以使用tree 来查看它更漂亮一点:

git ls-tree --full-tree --name-only -r HEAD | tree --fromfile .

你可能想要分页:

git ls-tree --full-tree --name-only -r HEAD | tree -C --fromfile . | $PAGER:-less

这当然值得在 git 配置中作为 tree 别名 :)

【讨论】:

【参考方案2】:

接受的答案仅显示当前目录树中的文件。要显示 所有 已提交的跟踪文件(在当前分支上),请使用

git ls-tree --full-tree --name-only -r HEAD
--full-tree 使命令像在 repo 的根目录中一样运行。 -r 递归到子目录。结合--full-tree,这将为您提供所有已提交、跟踪的文件。 --name-only 在您只需要文件路径时删除 SHA / 权限信息。 HEAD 指定您想要跟踪的已提交文件列表的分支。您可以将其更改为 master 或任何其他分支名称,但 HEAD 是您现在签出的提交。

这是从接受的答案到〜重复问题https://***.com/a/8533413/4880003的方法。

【讨论】:

Nathan,您说“结合--full-tree,这将为您提供所有已提交、已跟踪的文件”。这是否意味着自 repo 开始以来已提交的所有文件,或者是否有一些截止?当前接受的答案包括一个git log 命令,其输出比您的命令长几千行。我正在尝试查找近十年前提交的大文件,以便从历史中删除它们。【参考方案3】:

您可能希望使用它进行彩色输出。

我用这个单行来列出当前分支的当前目录中被跟踪的文件和目录:

ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)

您可能希望将其添加为别名:

alias gl='ls --group-directories-first --color=auto -d $(git ls-tree $(git branch | grep \* | cut -d " " -f2) --name-only)'

如果要递归列出文件:

'ls' --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)

还有一个别名:

alias glr="'ls' --color=auto -d \$(git ls-tree -rt \$(git branch | grep \\* | cut -d \" \" -f2) --name-only)"

【讨论】:

您提供的 glr 别名看起来有点奇怪,所以我制作了一个与您提供的第一个别名的格式更一致的版本:alias glr='ls --color=auto -d $(git ls-tree -rt $(git branch | grep \* | cut -d " " -f2) --name-only)'。在 Debian 10 上使用 git version 2.20.1 测试。【参考方案4】:

由 git 管理的文件由git ls-files 显示。查看其手册页。

【讨论】:

这似乎只显示当前目录下的文件。 介意我编辑它以包含手册页的相关部分吗? @NathanBasanese 也许您可以使用该信息添加另一个答案。 @LyleZ 也许这是为了与ls...或ls -R保持一致 @LyleZ 此外,此行为与 git ls-tree 相同 - 它与 pwd 相关。【参考方案5】:

如果要列出当前在分支master 下跟踪的所有文件,可以使用以下命令:

git ls-tree -r master --name-only

如果您想要一份曾经存在的文件列表(即包括已删除的文件):

git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'

【讨论】:

如果要列出当前分支的文件,请使用 git ls-tree -r HEAD --name-only 为什么没有列出目录? @NicolasLykkeIversen - git 不直接对目录进行版本控制。相反,它存储文件及其路径。 ls-tree 将输出所有版本化文件。为了更好地理解这种区别,请尝试将一个空目录暂存到 git。空目录永远不会出现在分阶段的更改中。对这样一个空目录进行版本控制的唯一方法是对目录下的文件进行实际版本控制。对于在版本控制中需要这样一个空占位符目录的用例,您可以在该目录下创建一个虚拟文件,并对其进行版本控制。我希望解释清楚。 请注意,ls-tree master 不会在暂存区显示跟踪的文件。 列出所有曾经存在过的文件的命令实际上只列出了直到 HEAD 当前所在点的文件,并且它也忽略了重命名等情况。所以我建议git log --pretty=format: --name-only --all | sort -u | sed '/^$/d'

以上是关于如何让 git 显示正在跟踪的文件列表?的主要内容,如果未能解决你的问题,请参考以下文章

让 git status 显示未修改/未更改的跟踪文件?

Git 暂存文件列表

如何找到提交给 git 分支的文件列表?

Prolog:如何调整跟踪中显示的列表的最大长度?

如何忽略未跟踪文件中的 .DS_Store? [复制]

sh 如何让Git“忘记”一个被跟踪但现在位于.gitignore的文件?