例如,您可以执行git remote --verbose
并且git将显示您项目中的所有遥控器,git branch
将显示所有分支并发出当前分支的信号,但是如何列出所有子树,没有任何破坏性的命令? git subtree
将提供用法示例,但不会列出任何内容。子树只有add
,pull
,push
,split
,merge
。
答案 0 :(得分:41)
没有任何明确的方法可以做到这一点(至少目前为止),此处列出了唯一可用的命令(正如您自己记录的那样,但这里是未来搜索者的参考): https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt
我查看了代码(基本上所有这个机制都是一个大的shell脚本文件),所有跟踪都是通过提交消息完成的,所以所有函数都使用git log
机制,有很多grep
- 找到它自己的数据。
由于子树必须在存储库的根文件夹中有一个具有相同名称的文件夹,您可以运行它来获取所需的信息(在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的家伙加入下一个版本:)
答案 1 :(得分:25)
跟进Sagi Illtus' answer,将以下别名添加到~/.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
答案 2 :(得分:0)
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"