47

例如,您可以执行 agit remote --verbose并且 git 将显示您在项目中拥有的所有遥控器,git branch将显示所有分支并发出当前分支的信号,但是如何列出所有子树,而不使用任何破坏性命令?git subtree将给出使用示例,但不会列出任何内容。子树只有add, pull, push, split, merge.

4

3 回答 3

62

没有任何明确的方法可以做到这一点(至少现在),这里列出了唯一可用的命令(正如你自己指出的那样,但这里是未来寻求者的参考): https ://github.com/git/ git/blob/master/contrib/subtree/git-subtree.txt

我浏览了代码(基本上所有这些机制都是一个大的 shell 脚本文件),所有的跟踪都是通过提交消息完成的,所以所有的函数都使用git log带有大量grep-ing 的机制来定位它自己的数据。

由于子树在存储库的根文件夹中必须有一个同名的文件夹,因此您可以运行它来获取所需的信息(在 Bash shell 中):

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq

现在,这不会检查文件夹是否存在(您可以删除它并且子树机制不会知道),所以这里是您如何仅列出现有子树的方法,这将适用于存储库中的任何文件夹:

 git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then echo {}; fi'

如果您真的愿意,请向 Git 人员提出建议以包含在下一个版本中:)

于 2013-08-20T15:38:37.840 回答
33

跟进Sagi Illtus 的回答,将以下别名添加到您的~/.gitconfig

[alias]
    ls-subtrees = !"git log | grep git-subtree-dir | awk '{ print $2 }'"

然后您可以git ls-subtrees从存储库的根目录显示所有子树路径:

$> cd /path/to/repository
$> git ls-subtrees
some/subtree/dir
于 2014-12-04T16:06:49.720 回答
3

grepping 日志的问题在于,它不会告诉您子树是否仍然存在。我通过简单地测试目录的存在来解决这个问题:

[alias]
        ls-subtrees = !"for i in $(git log | grep git-subtree-dir | sed -e 's/^.*: //g' | uniq); do test -d $i && echo $i; done"
于 2019-10-15T22:27:32.640 回答