29

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

本质上,它会提供一个与您在 Github 上看到的类似的目录列表。来自 Windows,我不太熟悉进行 globbing 的正确方法(?)。

4

7 回答 7

27

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

编辑:改编自@iegik 的评论并更好地适应所提出的问题,

git ls-files . | sed s,/.*,/, | uniq

将列出从当前级别开始的索引文件并将目录折叠到它们的第一个组件。

于 2012-05-04T21:28:15.167 回答
17

我相信git ls-tree --name-only [branch]会做你正在寻找的。

于 2012-05-04T18:12:04.283 回答
6

git ls-tree <tree-ish>很好,但我不知道如何将索引指定为<tree-ish>. (尽管我确信肯定会有一些全大写的参考来做到这一点。)

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

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

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

Changecut-f参数来控制深度。例如,-f-2(那是破折号二)显示文件和目录最多两个级别:

$ git ls-files | cut -d/ -f-2 | uniq

如果您将<path>参数指定为ls-files,请确保增加-f以适应前导目录:

$ git ls-files foo/bar | cut -d/ -f-3 | uniq
于 2017-03-27T02:08:56.770 回答
5

仅列出当前工作目录中 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)

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

于 2015-04-04T19:57:10.653 回答
2

我很惊讶这太难了……但不要让我开始抱怨 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`'
于 2018-03-05T17:14:08.480 回答
0

不管你信不信,我找到的最简单的解决方案就是cd在终端中简单地进入你想要的目录。运行将只为您提供该目录的结果,而不是运行git ls-files/project/src/project

不是最技术性的答案,但是嘿,它有效!

于 2020-05-13T14:55:01.440 回答
0

使用这个简单的 bash 脚本来定义任何级别的子目录

于 2020-10-31T16:58:03.483 回答