【问题标题】:how to `git ls-files` for just one directory level.如何为一个目录级别“git ls-files”。
【发布时间】:2012-05-14 05:48:34
【问题描述】:

我正在使用 msysgit (1.7.9),我正在寻找对 git ls-files 命令的正确调用,以仅显示当前级别的(跟踪的)文件和目录,或者来自索引,或者如果这更容易,则为当前工作目录。

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

【问题讨论】:

    标签: git ls glob


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我想你想要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
      • @iegik 这好多了。我会 sed s,/.*,, 而不是 awk,只是因为它更短。请给这个答案好吗?我会赏金的。
      • 不适用于 macOS — ls: illegal option -- -。我想你至少在 macOS 上想要… | xargs 'ls' -Gdl——其他人可以检查它是否也适用于 Linux?
      • 另外,如何将其设置为 git 别名?非 shell 别名似乎不支持管道,但 shell 别名运行在存储库根目录,而不是当前目录(git config --global alias.ls "\!git ls-files | awk -F / '{print $1}' | uniq | xargs 'ls' -Gdl" 是一个开始,但是……)
      【解决方案3】:

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

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

      【讨论】:

      • 简单而有效 =),如果您在 cd 进入的文件夹中没有更多文件夹,唯一的问题是,如果您有文件夹,其他文件也会向下移动
      【解决方案4】:

      我很惊讶这这么难......但不要让我开始抱怨 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`'
      

      【讨论】:

      • 通过“ls”着色的聪明技巧。我个人更喜欢'ls -ld',但这就是我。您可以使用 --name-only(可能是新的)标志,而不是通过 sed 进行管道传输。
      • @Uri:对,--name-only 更简单,谢谢!而且使用 -ld 肯定比上面一些获取完整信息的方法更简单。
      • 对于使用--name-only的别名,请参阅stackoverflow.com/a/57342429/10850071
      【解决方案5】:

      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
      

      【讨论】:

      【解决方案6】:

      仅列出当前工作目录下被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 &lt;(git ls-files | sed 's/\/.*//g' | sort | uniq)

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

      【讨论】:

      • 这很好...我想知道为什么我不能将它添加为[alias]?? ls-tracked = "! f(){ ls | grep -f &lt;(git ls-files | sed 's/\/.*//g' sort | uniq); }; f"-> fatal: bad config file
      【解决方案7】:

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

      【讨论】:

      • 谢谢,那是 95% 的方式。您的 git ls-tree --name-only [branch] 列出了同一列表中的目录和文件(即没有尾随的 / 目录)。我发现git ls-tree -d --name-only [branch] 只会列出目录。 “问题”的一部分是发现子模块目录。
      • 这应该是公认的答案!那,或者这是一个非常好的开始。 :D
      • @PhilipOakley 我试图做类似的事情,除了git ls-files 而不是git ls-tree。使用git ls-files,看起来等效选项是--directory(在该命令中,-d--deleted 的缩写)。
      猜你喜欢
      • 2019-08-08
      • 2019-10-02
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2016-08-13
      相关资源
      最近更新 更多