我如何列出根目录下的git子树?

biswetbf  于 2023-01-07  发布在  Git
关注(0)|答案(4)|浏览(161)

例如,你可以执行一个git remote --verbose命令,git会显示你项目中所有的remote,git branch会显示所有的分支并指示当前分支,但是如何列出所有的子树,而不使用任何破坏性命令呢?git subtree会给出使用示例,但不会列出任何内容。merge.

slsn1g29

slsn1g291#

没有任何明确的方法可以做到这一点(至少目前是这样),这里列出了唯一可用的命令(正如你自己所指出的,但这里有一个供未来搜索者参考的参考):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的人在下一个版本中加入:)

p5cysglq

p5cysglq2#

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
ycl3bljg

ycl3bljg3#

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"
wtlkbnrh

wtlkbnrh4#

看看subrepo,它解决了使用“原生”git subtree命令时的缺点。这些缺点是由于git不存储子树的原始repo url。

相关问题