如何 git 仅列出跟踪的目录?

问题描述 投票:0回答:5

使用

git list-files
为我提供目录和其中跟踪的文件。有没有这样的命令:

git list-directories

或者类似的东西只列出跟踪的非空非递归目录名称?

git
5个回答
26
投票

git ls-files | xargs -n 1 dirname | uniq


3
投票
git ls-tree -rt HEAD:./ | awk '{if ($2 == "tree") print $4;}'

如果文件可能包含空格,我们将不得不尝试: 使用 awk 打印从第 n 个到最后一个的所有列,这不是很有趣。

-r
使其递归,
-t
使其在递归时打印树,默认情况下关闭。

我无法使用

ls-tree
,如所述:https://stackoverflow.com/a/20247815/895245,因为很难处理没有文件、只有其他目录的目录。

此方法还显示空树

在 Git 2.19.0 上测试。


0
投票

以下命令(利用

git ls-files
)直接返回包含已提交或暂存文件的目录的所有路径。 无论在哪个“当前工作目录”中执行此命令都可以执行

(即,它可以在此 git 存储库的任何子目录中执行,但始终返回包括来自其他子目录的路径(而不是仅返回仅

当前目录的路径(这是我在其他答案中注意到的特征/限制/警告/陷阱)))。 返回的路径是相对于该git存储库的根目录的。

git ls-files --full-name $(git rev-parse --show-toplevel) | xargs -n 1 dirname | sort --version-sort | uniq | grep --invert-match '^\.$'

说明:

git ls-files --full-name ...
    :返回相对于“起点”的
  • file
    路径。
    ... $(git rev-parse --show-toplevel)
  • :将“起点”设置为此 git 存储库的根目录。如果您想要拥有所有路径,而不仅仅是作用域为执行此命令的当前工作目录的路径,这一点很重要。
  • xargs -n 1 dirname
  • :上一个管道步骤已返回已提交和暂存的
  • 文件
    。此管道步骤返回其包含的
    目录 sort --version-sort
  • :默认情况下,
  • sort
    会意外地对带点的字符串(例如
    .config/foo
    )进行排序。 
    --version-sort
     选项可实现更符合逻辑的排序。
    uniq
  • :过滤掉重复的条目。
  • grep --invert-match '^\.$'
  • :之前的管道步骤创建了一个行条目“
  • .
    ”,表示此 git 存储库的根目录中直接存在至少一个已提交或暂存的文件。这个“
    .
    ”条目可能是理想的,也可能不是理想的。当不需要时,这个 
    grep
     语句会将其过滤掉。
    示例 git 存储库(位于 
  • /home/someuser/git/testrepository/
内):

# committed files (listed with "git ls-files /home/someuser/git/testrepository/")
.config/foo.conf
.config/very/nested/deep.txt
README.md
a-directory/a1-file.txt
a-directory/a2-file.txt
z-directory/z-file.txt
z-directory/z-subdirectory/z-subfile.txt

从任何包含的(子)目录运行上述命令,例如来自
/home/someuser/git/testrepository/.config/very/

$ cd /home/someuser/git/testrepository/.config/very/
$ git ls-files --full-name $(git rev-parse --show-toplevel) | xargs -n 1 dirname | sort --version-sort | uniq | grep --invert-match '^\.$'
.config
.config/very/nested
a-directory
z-directory
z-directory/z-subdirectory

注意事项:

.config/very
    不存在于返回的列表中。这是因为
  • .config/very/
    中不存在任何
    直接提交或暂存的文件。
    .config/very/nested
  • 出现在返回的列表中,因为它(直接)包含已提交的文件
  • .config/very/nested/deep.txt
    还从直接没有任何提交文件的目录返回路径(但包含带有提交文件的子目录)
以下命令(利用

git ls-tree

)将返回通向

commited

 文件的 
all 路径,包括中间目录。与前面的命令不同,它将包含仅包含暂存且从未提交的文件的目录的路径: git ls-tree -rt HEAD --name-only --full-tree | xargs -n 1 dirname | sort --version-sort | uniq | grep --invert-match '^\.$'

这是前面给出的示例 git 存储库的输出:
$ cd /home/someuser/git/testrepository/.config/very/
$ git ls-tree -rt HEAD --name-only --full-tree | xargs -n 1 dirname | sort --version-sort | uniq | grep --invert-match '^\.$'
.config
.config/very
.config/very/nested
a-directory
z-directory
z-directory/z-subdirectory

注意事项:

使用此命令,

.config/very
  • 出现在返回的列表中,尽管该目录中没有直接提交的文件。包含它是因为它会导致提交的文件 (.config/very/nested/deep.txt)。
    
        

0
投票

git ls-files | sed -e '/^[^/]*$/d' -e 's|/[^/]*$||' | sort -u



0
投票

git ls-files -z -o --exclude-standard | xargs -i dirname '{}' | uniq

© www.soinside.com 2019 - 2024. All rights reserved.