我正在使用msysgit(1.7.9),我正在寻找正确的git ls-files
命令调用,以显示当前级别的(跟踪的)文件和目录,无论是从索引还是当前工作目录,如果那更容易。
基本上它会给出一个类似于你在Github上看到的目录列表。来自Windows,我不太熟悉正确的方法(?)。
我想你想要git ls-tree HEAD
品尝。 ls-tree输出的第二个字是tree
用于目录,blob
用于文件,commit
用于子模块,文件名是ascii选项卡之后的所有内容
我相信git ls-tree --name-only [branch]
会做你想要的。
git ls-tree <tree-ish>
很好,但我无法弄清楚如何将索引指定为<tree-ish>
。 (虽然我确定必须有一些全部大写的参考才能做到这一点。)
无论如何,ls-files
隐含地对索引起作用,所以我不妨使用它:
$ git ls-files | cut -d/ -f1 | uniq
这仅显示当前目录中的文件和目录。
改变cut
的-f
参数来控制深度。例如,-f-2
(即破折号2)显示最多两级的文件和目录:
$ git ls-files | cut -d/ -f-2 | uniq
如果您为<path>
指定ls-files
参数,请确保增加-f
以容纳前导目录:
$ git ls-files foo/bar | cut -d/ -f-3 | uniq
为了只列出当前工作目录中由git跟踪的文件,我发现以下几率比使用git ls-tree...
快几倍:
ls | grep -f <(git ls-files)
如果你还想要包含目录,那将需要与sed进行一些混乱:
ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)
假设您的文件名中没有任何“/”字符。以及...
ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)
为了也列出“不可见”(尚未跟踪)的文件。
我很惊讶这很难......但是不要让我开始关注git。
关于jthill答案的变体似乎是别的(嘿,我是语言学家,我有许可证新词)。变种是
ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`
这使用'ls'来格式化输出,因此您可以获得颜色编码(如果您使用它),等等。它也可以作为别名:
alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`'
FWIW,你也可以使用递归命令的别名,这样你就可以使用'ls'格式(例如,如果你的路径+文件名不是太长,你会得到两个列输出,可执行文件的颜色编码等)
alias gitls-r='ls `git ls-files`'