如何仅为一个目录级别设置“git ls files”。

如何仅为一个目录级别设置“git ls files”。,git,ls,glob,Git,Ls,Glob,我使用的是msysgit(1.7.9),我正在寻找正确调用gitls files命令,以显示当前级别的(跟踪的)文件和目录,可以是索引,也可以是当前工作目录(如果更容易的话) 本质上,它将提供一个目录列表,类似于您在Github上看到的目录列表。来自Windows,我不太熟悉进行全局搜索的正确方法(?) 我相信git-ls-tree——只有名字的[branch]能满足你的需求。我想你想要git-ls-tree-HEAD尝一尝。ls-tree输出的第二个字将是tree对于目录,blob对于文件,c

我使用的是msysgit(1.7.9),我正在寻找正确调用
gitls files
命令,以显示当前级别的(跟踪的)文件和目录,可以是索引,也可以是当前工作目录(如果更容易的话)


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

我相信
git-ls-tree——只有名字的[branch]
能满足你的需求。

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

编辑:根据问题进行调整,以更好地适应问题

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

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

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

ls | grep -f <(git ls-files)
ls | grep-f
gitls-tree
很好,但我不知道如何将索引指定为
。(尽管我确信一定会有一些“全大写”的引用来做到这一点。)

无论如何,
ls文件
隐式地作用于索引,因此我不妨使用它:

$git ls文件| cut-d/-f1 | uniq
这仅显示当前目录中的文件和目录

cut
-f
参数更改为控制深度。例如,
-f-2
(即破折号2)显示的文件和目录有两层深度:

$ git ls-files | cut -d/ -f-2 | uniq
如果将
参数指定给
ls files
,请确保增加
-f
,以适应前导目录:

$ git ls-files foo/bar | cut -d/ -f-3 | 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,您还可以将recursive命令别名,以便使用“ls”格式(例如,如果您的路径+文件名不太长,您将获得两列输出、可执行文件的颜色编码等)


信不信由你,我找到的最简单的解决方案就是将
cd
放入终端中所需的目录中。在
/project/src
中运行
git ls文件
将只从该目录中获得结果,而不是在
/project
中运行它


这不是最技术性的答案,但是,嘿,这很有效

任何级别的define子目录都可以使用它

谢谢,这是95%的方法。您的
git ls树--name only[branch]
列出了同一列表中的目录和文件(即,对于目录,没有尾随的
/
)。我发现
gitls tree-d--name only[branch]
只列出目录。“问题”的一部分是发现子模块目录。这可能是公认的答案!或者说这是一个很好的开始D@PhilipOakley我试图做类似的事情,除了使用
gitls文件
而不是
gitls树
。对于
git ls files
,它的等效选项似乎是
--directory
(在该命令中,
-d
--deleted
的缩写)。这很好。。。我想知道为什么我不能将其添加为
[别名]
ls tracked=“!f(){ls | grep-f
git ls files | awk-f/'{print$1}”“|uniq | xargs ls-dl--color=auto
@iegik这更好。我想用sed s、/.*、
代替awk,因为它比较短。请回答这个问题吧?我会赏金的。在macOS上不起作用--
ls:非法选项--
。我想,至少在macOS上,
。| xargs'ls'-Gdl
-其他人可以使用它检查这是否也适用于Linux?另外,如何将其设置为git别名?非shell别名似乎不支持管道,但shell别名在存储库根目录下运行,而不是在当前目录下运行(
git config--global alias.ls”\!git ls files | awk-F/'{print$1}'| uniq | xargs'ls'-Gdl“
是一个开始,但是…)您可以使用.Smart-trick通过“ls”着色来获取索引树。我个人更喜欢“ls-ld”,但这就是我。您可以使用--name(可能是新的)来代替通过sed进行管道传输flag.@Uri:right,--name only更简单,谢谢!使用-ld肯定比上面的一些方法更简单,可以获取完整信息。有关使用
--name only
的别名,请参阅
alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`'
alias gitls-r='ls `git ls-files`'