如何'git ls-files'仅用于一个目录级别,

c7rzv4ha  于 2023-01-11  发布在  Git
关注(0)|答案(7)|浏览(194)

我使用的是msysgit(1.7.9),我正在寻找git ls-files命令的正确调用,以便只显示当前级别的(跟踪的)文件和目录,或者来自索引,或者如果更容易的话,显示当前工作目录。
本质上它会给予一个目录列表,类似于你在Github上看到的。来自Windows,我不太熟悉做globbing(?)的正确方法。

um6iljoc

um6iljoc1#

我想你会想尝试一下git ls-tree HEAD sed'd,ls-tree输出的第二个单词是tree,表示目录,blob表示文件,commit表示子模块,文件名是ASCII制表符之后的所有内容。
编辑:改编自@iegik的评论,以更好地适应所问的问题,

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

将列出从当前级别开始的索引文件,并将目录折叠到其第一个组件。
进一步编辑:另一种方法是

git ls-tree `git write-tree` .

而且你可以使用git ls-tree的选项来做一些不错的调味料。

flseospp

flseospp2#

我相信git ls-tree --name-only [branch]会满足您的需求。

ldioqlga

ldioqlga3#

为了只列出当前工作目录中被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)
以便也列出“不可见”(还被跟踪)文件。

jdzmm42g

jdzmm42g4#

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
vnzz0bqm

vnzz0bqm5#

我很惊讶这是如此困难...但不要让我开始对我的抱怨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`'
z6psavjg

z6psavjg6#

信不信由你,我找到的最简单的解决方案是将cd简单地放到您希望在终端中使用的目录中,在/project/src中运行git ls-files将只从该目录中给予结果,而不是在/project中运行它
不是最技术的答案,但嘿,它的工作!

wfypjpf4

wfypjpf47#

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

相关问题