如何列出根目录下的 git 子树?
Posted
技术标签:
【中文标题】如何列出根目录下的 git 子树?【英文标题】:How can I list the git subtrees on the root? 【发布时间】:2013-05-14 12:16:39 【问题描述】:例如,您可以执行git remote --verbose
并且git 将显示您在项目中的所有远程,git branch
将显示所有分支并发出当前分支的信号,但是如何列出所有子树,没有任何破坏性命令? git subtree
将给出使用示例,但不会列出任何内容。子树只有add
,pull
,push
,split
,merge
。
【问题讨论】:
请问什么是子树?运行git subtree
给了我git: 'subtree' is not a git command.
。
你需要分开安装子树,它现在没有和git捆绑。 engineeredweb.com/blog/how-to-install-git-subtree 。子树是子模块的更好替代品:)
@pocesar git subtree has been merged 到主线 git,它从 1.7.11 版本开始可用
确实如此,但某些 git 版本(如上面的@jokester)并没有附带它。我在 Windows 上使用 msysgit 1.8.2.1,它自带 :)
嗯...我刚刚从源代码构建了 1.8.4 以获取最新版本,它还说“子树”不是 git 命令。我的“git --version”说:git version 1.8.4.rc1.4.gd6cbf2f
【参考方案1】:
没有任何明确的方法可以做到这一点(至少目前是这样),这里列出了唯一可用的命令(正如您自己指出的那样,但这里是未来寻求者的参考): 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 人员推荐它以包含在下一个版本中:)
【讨论】:
你给出的命令对我不起作用。混帐日志 | grep git-subtree-dir 不返回任何结果(git 版本 1.7.9.5) +1。 @procesar,FlipMcF:这在 Windows 上的“git bash”中对我有用:“git version 1.8.5.2.msysgit.0”。它应该起作用的原因是“git subtree”命令在提交消息中添加了几行以“git-subtree-”开头的行,其中一行看起来像“git-subtree-dir:you-prefix-folder”。对于“教授” - 只需在运行“git subtree add ...”后立即查看“git log”的输出,您就会看到这些行。 @FlipMcF,在 1.7.11 中添加了官方子树支持,所以我猜你使用的是旧的和分离的子树模块,它不能作为现代版本工作。您可以安装最新的子树脚本(参见here),或者升级您的整个 git 安装。 谢谢!这就是为什么我确保在我的评论中包含我的版本。我有预感是因为我的旧版本。 酷,很高兴我们能帮上忙 :)【参考方案2】:跟进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
【讨论】:
这会很棒,除非它在我的仓库中吐出重复项 - 可能是因为我添加了已删除并重新添加了一个子树。当我真正知道自己在做什么时,这会有所帮助;-) @MattBracewell 看看uniq
。您可以更新别名以通过管道传递给它,或者git ls-subtrees|uniq
或使用sort -u
并按字母顺序排列目录作为奖励!【参考方案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"
【讨论】:
以上是关于如何列出根目录下的 git 子树?的主要内容,如果未能解决你的问题,请参考以下文章