使用
git list-files
为我提供目录和其中跟踪的文件。有没有这样的命令:
git list-directories
或者类似的东西只列出跟踪的非空非递归目录名称?
git ls-files | xargs -n 1 dirname | uniq
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 上测试。
以下命令(利用
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 ...
路径。
... $(git rev-parse --show-toplevel)
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
)。
git ls-files | sed -e '/^[^/]*$/d' -e 's|/[^/]*$||' | sort -u
git ls-files -z -o --exclude-standard | xargs -i dirname '{}' | uniq