如何只为一个目录级别`git ls-files`。

问题描述 投票:18回答:5

我正在使用msysgit(1.7.9),我正在寻找正确的git ls-files命令调用,以显示当前级别的(跟踪的)文件和目录,无论是从索引还是当前工作目录,如果那更容易。

基本上它会给出一个类似于你在Github上看到的目录列表。来自Windows,我不太熟悉正确的方法(?)。

git ls glob
5个回答
18
投票

我想你想要git ls-tree HEAD品尝。 ls-tree输出的第二个字是tree用于目录,blob用于文件,commit用于子模块,文件名是ascii选项卡之后的所有内容


14
投票

我相信git ls-tree --name-only [branch]会做你想要的。


5
投票

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

4
投票

为了只列出当前工作目录中由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)

为了也列出“不可见”(尚未跟踪)的文件。


1
投票

我很惊讶这很难......但是不要让我开始关注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`'
© www.soinside.com 2019 - 2024. All rights reserved.