【发布时间】:2012-05-14 05:48:34
【问题描述】:
我正在使用 msysgit (1.7.9),我正在寻找对 git ls-files 命令的正确调用,以仅显示当前级别的(跟踪的)文件和目录,或者来自索引,或者如果这更容易,则为当前工作目录。
本质上,它会提供一个类似于您在 Github 上看到的目录列表。来自 Windows,我不太熟悉进行 globbing 的正确方法(?)。
【问题讨论】:
我正在使用 msysgit (1.7.9),我正在寻找对 git ls-files 命令的正确调用,以仅显示当前级别的(跟踪的)文件和目录,或者来自索引,或者如果这更容易,则为当前工作目录。
本质上,它会提供一个类似于您在 Github 上看到的目录列表。来自 Windows,我不太熟悉进行 globbing 的正确方法(?)。
【问题讨论】:
使用此simple bash script 定义任何级别的子目录
【讨论】:
我想你想要git ls-tree HEADsed'd 尝尝。 ls-tree 输出的第二个字将是 tree 用于目录,blob 用于文件,commit 用于子模块,文件名是 ascii 选项卡之后的所有内容。
编辑:改编自 @iegik's comment 并更好地适应所提出的问题,
git ls-files . | sed s,/.*,/, | uniq
将从当前级别开始列出索引文件并将目录折叠到它们的第一个组件。
【讨论】:
git ls-files | awk -F / '{print $1}' | uniq | xargs ls -dl --color=auto
sed s,/.*,, 而不是 awk,只是因为它更短。请给这个答案好吗?我会赏金的。
ls: illegal option -- -。我想你至少在 macOS 上想要… | xargs 'ls' -Gdl——其他人可以检查它是否也适用于 Linux?
git config --global alias.ls "\!git ls-files | awk -F / '{print $1}' | uniq | xargs 'ls' -Gdl" 是一个开始,但是……)
不管你信不信,我找到的最简单的解决方案就是简单地将cd 放入终端中所需的目录。在/project/src 中运行git ls-files 将只为您提供该目录的结果,而不是在/project 中运行它
不是最技术性的答案,但是嘿,它有效!
【讨论】:
我很惊讶这这么难......但不要让我开始抱怨 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`'
【讨论】:
--name-only的别名,请参阅stackoverflow.com/a/57342429/10850071
git ls-tree <tree-ish> 很好,但我不知道如何将 索引 指定为 <tree-ish>。 (尽管我确信肯定会有一些全大写的参考来做到这一点。)
无论如何,ls-files 隐式地作用于索引,所以我不妨使用它:
$ git ls-files | cut -d/ -f1 | uniq
这仅显示当前目录中的文件和目录。
更改cut 的-f 参数以控制深度。例如,-f-2(即 dash 二)显示文件和目录的深度最多为两层:
$ git ls-files | cut -d/ -f-2 | uniq
如果您将<path> 参数指定为ls-files,请确保增加-f 以容纳前导目录:
$ git ls-files foo/bar | cut -d/ -f-3 | uniq
【讨论】:
git write-tree 获取索引树。
仅列出当前工作目录下被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)
为了同时列出“不可见”(尚未跟踪的)文件。
【讨论】:
[alias]?? ls-tracked = "! f(){ ls | grep -f <(git ls-files | sed 's/\/.*//g' sort | uniq); }; f"-> fatal: bad config file
我相信git ls-tree --name-only [branch] 会满足您的需求。
【讨论】:
git ls-tree --name-only [branch] 列出了同一列表中的目录和文件(即没有尾随的 / 目录)。我发现git ls-tree -d --name-only [branch] 只会列出目录。 “问题”的一部分是发现子模块目录。
git ls-files 而不是git ls-tree。使用git ls-files,看起来等效选项是--directory(在该命令中,-d 是--deleted 的缩写)。