使用命令行 git,如何让 git 显示存储库中正在跟踪的文件的列表?
如果要列出当前在分支 master
下跟踪的所有文件,可以使用以下命令:
git ls-tree -r master --name-only
如果您想要一个曾经存在的文件列表(即包括已删除的文件):
git log --pretty=format: --name-only --diff-filter=A | sort - | sed '/^$/d'
由 git 管理的文件由 git ls-files
显示。查看其手册页。
ls
...或 ls -R
保持一致
git ls-tree
相同 - 它与 pwd
相关。
接受的答案仅显示当前目录树中的文件。要显示所有已提交的跟踪文件(在当前分支上),请使用
git ls-tree --full-tree --name-only -r HEAD
--full-tree 使命令像在 repo 的根目录中一样运行。
-r 递归到子目录。结合 --full-tree,这将为您提供所有已提交、跟踪的文件。
--name-only 在您只需要文件路径时删除 SHA / 权限信息。
HEAD 指定您想要跟踪的已提交文件列表的分支。您可以将其更改为 master 或任何其他分支名称,但 HEAD 是您现在签出的提交。
这是从接受的答案到〜重复问题https://stackoverflow.com/a/8533413/4880003的方法。
--full-tree
,这将为您提供所有已提交、跟踪的文件”。这是否意味着自 repo 开始以来已提交的所有文件,或者是否有一些截止?当前接受的答案包括一个 git log
命令,其输出比您的命令长几千行。我正在尝试寻找大约十年前提交的大文件,以便将它们从历史中删除。
您可能希望使用它进行彩色输出。
我使用这个单行来列出当前分支的当前目录中的跟踪文件和目录:
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
测试。
在现有答案的基础上,您可以使用 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 config 中作为 tree
别名 :)
不定期副业成功案例分享
git
不直接对目录进行版本控制。相反,它存储文件及其路径。ls-tree
将输出所有版本化文件。为了更好地理解这种区别,请尝试将一个空目录暂存到git
。空目录永远不会出现在分阶段的更改中。对这样一个空目录进行版本控制的唯一方法是对目录下的文件进行实际版本控制。对于在版本控制中需要这样一个空占位符目录的用例,您可以在该目录下创建一个虚拟文件,并对其进行版本控制。我希望解释清楚。ls-tree master
不会在暂存区显示跟踪 文件。git log --pretty=format: --name-only --all | sort -u | sed '/^$/d'