我使用的是msysgit(1.7.9),我正在寻找git ls-files命令的正确调用,以便只显示当前级别的(跟踪的)文件和目录,或者来自索引,或者如果更容易的话,显示当前工作目录。本质上它会给予一个目录列表,类似于你在Github上看到的。来自Windows,我不太熟悉做globbing(?)的正确方法。
git ls-files
um6iljoc1#
我想你会想尝试一下git ls-tree HEAD sed'd,ls-tree输出的第二个单词是tree,表示目录,blob表示文件,commit表示子模块,文件名是ASCII制表符之后的所有内容。编辑:改编自@iegik的评论,以更好地适应所问的问题,
git ls-tree HEAD
tree
blob
commit
git ls-files . | sed s,/.*,/, | uniq
将列出从当前级别开始的索引文件,并将目录折叠到其第一个组件。进一步编辑:另一种方法是
git ls-tree `git write-tree` .
而且你可以使用git ls-tree的选项来做一些不错的调味料。
git ls-tree
flseospp2#
我相信git ls-tree --name-only [branch]会满足您的需求。
git ls-tree --name-only [branch]
ldioqlga3#
为了只列出当前工作目录中被git跟踪的文件,我发现下面的代码比git ls-tree...快好几倍:
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)以便也列出“不可见”(还被跟踪)文件。
ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)
jdzmm42g4#
git ls-tree <tree-ish>很好,但是我不知道如何将***索引***指定为<tree-ish>(尽管我确信肯定会有一些全大写的引用来实现这一点)。无论如何,ls-files隐式地作用于索引,所以我也可以使用它:
git ls-tree <tree-ish>
<tree-ish>
ls-files
$ git ls-files | cut -d/ -f1 | uniq
这只显示当前目录中的文件和目录。更改cut的-f参数来控制深度。例如,-f-2(即 * 破折号 * 2)显示的文件和目录最多可达两级深度:
cut
-f
-f-2
$ git ls-files | cut -d/ -f-2 | uniq
如果将<path>参数指定为ls-files,请确保增加-f以容纳前导目录:
<path>
$ git ls-files foo/bar | cut -d/ -f-3 | uniq
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`'
z6psavjg6#
信不信由你,我找到的最简单的解决方案是将cd简单地放到您希望在终端中使用的目录中,在/project/src中运行git ls-files将只从该目录中给予结果,而不是在/project中运行它不是最技术的答案,但嘿,它的工作!
cd
/project/src
/project
wfypjpf47#
使用此simple bash script定义任何级别的子目录
7条答案
按热度按时间um6iljoc1#
我想你会想尝试一下
git ls-tree HEAD
sed'd,ls-tree输出的第二个单词是tree
,表示目录,blob
表示文件,commit
表示子模块,文件名是ASCII制表符之后的所有内容。编辑:改编自@iegik的评论,以更好地适应所问的问题,
将列出从当前级别开始的索引文件,并将目录折叠到其第一个组件。
进一步编辑:另一种方法是
而且你可以使用
git ls-tree
的选项来做一些不错的调味料。flseospp2#
我相信
git ls-tree --name-only [branch]
会满足您的需求。ldioqlga3#
为了只列出当前工作目录中被git跟踪的文件,我发现下面的代码比
git ls-tree...
快好几倍:如果您还想包含目录,那么在sed中可能会有一些混乱,例如:
假设你的文件名中没有任何“/”字符。
ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)
以便也列出“不可见”(还被跟踪)文件。
jdzmm42g4#
git ls-tree <tree-ish>
很好,但是我不知道如何将***索引***指定为<tree-ish>
(尽管我确信肯定会有一些全大写的引用来实现这一点)。无论如何,
ls-files
隐式地作用于索引,所以我也可以使用它:这只显示当前目录中的文件和目录。
更改
cut
的-f
参数来控制深度。例如,-f-2
(即 * 破折号 * 2)显示的文件和目录最多可达两级深度:如果将
<path>
参数指定为ls-files
,请确保增加-f
以容纳前导目录:vnzz0bqm5#
我很惊讶这是如此困难...但不要让我开始对我的抱怨git。
jthill答案的一个变体似乎是可别名的(嘿,我是语言学家,我有造新词的许可证)。
它使用'ls'来格式化输出,所以你可以得到颜色编码(如果你使用的话),等等。它也可以作为一个别名:
FWIW,你也可以为递归命令起别名,这样你就可以使用'ls'格式(例如,如果你的路径+文件名不是太长,你会得到两列输出,可执行文件的颜色编码,等等)
z6psavjg6#
信不信由你,我找到的最简单的解决方案是将
cd
简单地放到您希望在终端中使用的目录中,在/project/src
中运行git ls-files
将只从该目录中给予结果,而不是在/project
中运行它不是最技术的答案,但嘿,它的工作!
wfypjpf47#
使用此simple bash script定义任何级别的子目录