如何列出根目录下的 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 子树?的主要内容,如果未能解决你的问题,请参考以下文章

如何列出当前目录下,以install开头的所有文件

怎样使用C语言列出某个目录下的文件?

Git反向合并子树

列出/etc目录下的所有文件命令

用java写一个代码实现: 如何列出某个目录下的所有子目录

如何在 git 中列出版本控制的文件?