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

时间:2012-05-04 16:50:38

标签: git ls glob

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

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

7 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:14)

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

答案 2 :(得分:5)

git ls-tree <tree-ish>很好,但我无法弄清楚如何将 索引 指定为<tree-ish>。 (虽然我确信必须有一些全部大写的参考才能做到这一点。)

无论如何,ls-files隐式地对索引起作用,所以我不妨使用它:

$ git ls-files | cut -d/ -f1 | uniq

仅显示当前目录中的文件和目录。

更改cut的{​​{1}}参数以控制深度。例如,-f破折号两个)显示最多两层的文件和目录:

-f-2

如果您为$ git ls-files | cut -d/ -f-2 | uniq 指定<path>参数,请务必增加ls-files以容纳主要目录:

-f

答案 3 :(得分:4)

要仅列出当前工作目录中由git跟踪的文件,我发现以下内容比使用git ls-tree...快几倍:

ls | grep -f <(git ls-files)

如果您还想要包含目录,那将需要一些麻烦的事情,如下所示:

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)  
假设你没有任何&#39; /&#39;文件名中的字符。以及......

ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)

为了也列出&#34;隐形&#34; (尚未跟踪)文件。

答案 4 :(得分: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`'

答案 5 :(得分:0)

不管我信不信,我发现的最简单的解决方案是简单地cd进入终端中所需的目录。在git ls-files中运行/project/src只会使您从该目录获得结果,而在/project中运行它

不是最技术性的答案,但嘿,它可行!

答案 6 :(得分:0)

使用此simple bash script定义任何级别的子目录