Answers:
如果要列出分支下当前正在跟踪的所有文件master
,则可以使用以下命令:
git ls-tree -r master --name-only
如果要列出曾经存在的文件(即包括已删除的文件):
git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
git
不直接对目录进行版本控制。相反,它存储文件及其路径。ls-tree
将输出所有版本化的文件。为了更好地理解这种区别,请尝试将空目录暂存到git
。空目录将永远不会显示在分阶段的更改中。对这样一个空目录进行版本控制的唯一方法是对目录下的文件进行实际版本控制。对于在版本控制中需要这样一个空的占位符目录的用例,可以在该目录下创建一个虚拟文件,然后对其进行版本控制。我希望解释清楚。
ls-tree master
不会在暂存区中显示跟踪的文件。
由git管理的文件由显示git ls-files
。查看其手册页。
ls
...或ls -R
git ls-tree
- 相同,是相对于的pwd
。
接受的答案仅显示当前目录树中的文件。要显示所有已提交的跟踪文件(在当前分支上),请使用
git ls-tree --full-tree --name-only -r HEAD
--full-tree
使命令像在存储库的根目录中一样运行。-r
递归到子目录。与结合使用--full-tree
,可以为您提供所有已提交,已跟踪的文件。--name-only
当您只需要文件路径时,删除SHA /权限信息。HEAD
指定您要为其跟踪的已提交文件列表的哪个分支。您可以将其更改为master
或任何其他分支名称,但这HEAD
是您现在已签出的提交。这是从公认答案到〜重复问题https://stackoverflow.com/a/8533413/4880003的方法。
您可能需要彩色输出。
我使用这种单行代码在当前分支的当前目录中列出跟踪的文件和目录:
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)'
。经测试git version 2.20.1
Debian的10