例如,你可以执行一个git remote --verbose命令,git会显示你项目中所有的remote,git branch会显示所有的分支并指示当前分支,但是如何列出所有的子树,而不使用任何破坏性命令呢?git subtree会给出使用示例,但不会列出任何内容。merge.
git remote --verbose
git branch
git subtree
merge
slsn1g291#
没有任何明确的方法可以做到这一点(至少目前是这样),这里列出了唯一可用的命令(正如你自己所指出的,但这里有一个供未来搜索者参考的参考):https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt我浏览了代码(基本上所有的机制都是一个大的shell脚本文件),所有的跟踪都是通过提交消息完成的,所以所有的函数都使用git log机制,使用大量的grep-ing来定位自己的数据。因为子树必须在仓库的根文件夹中有一个同名的文件夹,所以你可以运行这个命令来获取你想要的信息(在Bash shell中):
git log
grep
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的人在下一个版本中加入:)
p5cysglq2#
在Sagi Illtus' answer上执行后续操作,将以下别名添加到~/.gitconfig
~/.gitconfig
[alias] ls-subtrees = !"git log | grep git-subtree-dir | awk '{ print $2 }'"
然后你可以从仓库的根目录git ls-subtrees来显示所有的子树路径:
git ls-subtrees
$> cd /path/to/repository $> git ls-subtrees some/subtree/dir
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"
wtlkbnrh4#
看看subrepo,它解决了使用“原生”git subtree命令时的缺点。这些缺点是由于git不存储子树的原始repo url。
4条答案
按热度按时间slsn1g291#
没有任何明确的方法可以做到这一点(至少目前是这样),这里列出了唯一可用的命令(正如你自己所指出的,但这里有一个供未来搜索者参考的参考):https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt
我浏览了代码(基本上所有的机制都是一个大的shell脚本文件),所有的跟踪都是通过提交消息完成的,所以所有的函数都使用
git log
机制,使用大量的grep
-ing来定位自己的数据。因为子树必须在仓库的根文件夹中有一个同名的文件夹,所以你可以运行这个命令来获取你想要的信息(在Bash shell中):
现在,它不检查文件夹是否存在(你可以删除它,子树机制不会知道),所以这里是你如何只列出现有的子树,这将在仓库中的任何文件夹工作:
如果你真的准备好了,建议Git的人在下一个版本中加入:)
p5cysglq2#
在Sagi Illtus' answer上执行后续操作,将以下别名添加到
~/.gitconfig
然后你可以从仓库的根目录
git ls-subtrees
来显示所有的子树路径:ycl3bljg3#
grepping日志的问题是它不能告诉你子树是否仍然存在。我已经通过简单地测试目录的存在来解决这个问题:
wtlkbnrh4#
看看subrepo,它解决了使用“原生”git subtree命令时的缺点。这些缺点是由于git不存储子树的原始repo url。