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

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

5
可能是 List files in local git repo? 的重复问题。 - Kristján
3
我相信是这样的。但是,当这里有一个更好的回答时,标记它为重复似乎不太合适。 - lindhe
8
在一个平行宇宙中,这个问题(https://superuser.com/q/429693/571125)及其所有答案的相似之处非常不可思议,但每个答案都有自己独特的风格。 - Jeff Puckett
1
@lindhe:这就像 StackExchange 对关闭重复问题的痴迷并不完全明智一样。 - iconoclast
5个回答

871

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

要列出当前在分支master中被追踪的所有文件,可以使用此命令:

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

如果您想要列出曾经存在的所有文件(包括已删除的文件):

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

107
如果您想列出当前分支的文件,请使用“git ls-tree -r HEAD --name-only”。 - Ramast
6
为什么目录没有列出? - Shuzheng
18
git中,它并不直接对目录进行版本控制,而是存储文件及其路径。使用ls-tree命令可以输出所有已版本控制的文件。为了更好地理解这一区别,请尝试将一个空目录添加到git中。空目录将永远不会出现在暂存更改中。要对这样一个空目录进行版本控制,唯一的方法就是在该目录下实际版本化一个文件。如果您需要在版本控制中使用这样的空占位目录,可以在目录下创建一个虚拟文件,并将其纳入版本控制。希望这样的解释很清楚明白。 - Tuxdude
3
请注意,ls-tree master 命令不会显示暂存区中的已跟踪文件。 - nn0p
1
列出所有曾经存在的文件的命令实际上只会列出到当前HEAD所在位置的文件,并且它也忽略了重命名等情况。因此,我建议使用git log --pretty=format: --name-only --all | sort -u | sed '/^$/d'命令。 - mic
显示剩余6条评论

250

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


7
这似乎只显示当前目录及其下面的文件。 - Lyle Z
12
我可以编辑一下,把手册页面的相关部分包含进来吗? - Nathan Basanese
2
@NathanBasanese 或许你可以添加另一个包含那些信息的答案。 - José Castro
@LyleZ 或许这是为了与 ls...或者 ls -R 保持一致。 - flow2k
1
@LyleZ 同样,git ls-tree 的行为也是相对于当前目录的。 - flow2k
@LyleZ - 我也可以看到当前目录子文件夹中的文件。 - Safwan

56

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

git ls-tree --full-tree --name-only -r HEAD
  • --full-tree 使命令表现得好像您在存储库的根目录中一样。
  • -r 递归进入子目录。 结合使用 --full-tree,这将为您提供所有提交的、已跟踪的文件。
  • --name-only 移除 SHA / 权限信息,因此您只需要文件路径。
  • HEAD 指定要获取所跟踪的提交文件列表的分支。 您可以将其更改为 master 或任何其他分支名称,但是 HEAD 是您当前检出的提交。

这是接受答案中的方法,来自 ~重复问题https://dev59.com/7moy5IYBdhLWcg3wdd1v#8533413.


Nathan,你说:“与--full-tree结合使用,这将为您提供所有已提交的跟踪文件”。这是否意味着自从repo开始以来提交的所有文件,还是有一些截止时间?目前接受的答案包括一个git log命令,其输出比您的命令多几千行。我正在尝试查找几乎十年前提交的大文件,以便从历史记录中修剪它们。 - Ungeheuer

10

你可能希望使用彩色输出。

我使用以下一行代码来列出当前分支中当前目录中已跟踪的文件和目录:

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 进行测试。 - baltakatei

6

在已有答案的基础上,你可以使用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别名 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接