Git 查找头上有特定文件的所有分支

Git 查找头上有特定文件的所有分支,git,Git,任务: 我需要找到所有的分支,它们的头中有一个给定名称的文件 情况: 我可以放心地假设,有许多(数百万)分支 我还可以放心地假设,每个分支top dir中都有许多文件。这一次,我可以通过创建子目录来解决问题,但对用户强制执行这一点是非常重要的,特别是因为我希望允许离线编辑,然后让那些git推送到服务器上 背景: 我将在一个特殊的wiki项目中使用git存储库,在这个项目中,每个用户始终维护自己的wiki视图 我正在为PHP中的只读git访问重新实现必要的git函数,因此给出任何git命

任务:

  • 我需要找到所有的分支,它们的头中有一个给定名称的文件
情况:

  • 我可以放心地假设,有许多(数百万)分支
  • 我还可以放心地假设,每个分支top dir中都有许多文件。这一次,我可以通过创建子目录来解决问题,但对用户强制执行这一点是非常重要的,特别是因为我希望允许离线编辑,然后让那些
    git推送到服务器上
背景:

  • 我将在一个特殊的wiki项目中使用git存储库,在这个项目中,每个用户始终维护自己的wiki视图
  • 我正在为PHP中的只读git访问重新实现必要的git函数,因此给出任何git命令对我来说都是有限的
  • 每个用户都由一个或多个分支机构维护,每个wiki页面上的所有其他用户和分支机构都应易于访问,同一页面的不同版本位于这些页面上
  • 我在服务器上只有空的存储库
目前,我的计划是这样的(PHP-ish伪代码):

显然,这是两个大的嵌套循环,有几十万个文件和数百万个分支,我不想在每个页面访问中都这样做

因此,除此之外,我看到的唯一选择是创建我自己的信息缓存,我将在post接收和/或post提交挂钩中更新这些信息

问题:

  • 有没有比我在这里描述的更优雅的解决方案?会是哪一个

据我所知,在wiki中,所有页面都在同一个目录中,搜索特定文件实际上是线性的


如果您设法存储未压缩的树对象(afaik,这仅适用于BLOB),那么您将能够通过二进制搜索找到其中的文件。所以你可以摆脱内部循环。但是似乎没有办法避免在分支上循环。

使用git维护数千个分支,更不用说数百万个分支,这远远超出了它的设计范围。使用数据库,它们就是为这个而设计的。所以,您建议将分支存储在DB而不是git中(问题:git gc几乎会删除所有内容)?还是你建议把所有的东西都放在数据库里?我使用git的观点是,已经有工具来管理这些。使用DB将完全使我的项目的分散方面不存在,并且已经存在足够多的集中Wiki,不需要编写另一个。哦,还有,顺便说一句:我没有必要把git放在服务器上。我完全可以在那里做些改变。它只需要与vannila客户端保持100%的兼容性。管理什么的工具?git无法管理您在一次回购中谈论的分支数量,也无法告诉您在其他回购的提交中有哪些文件。您可以完全控制gc的运行时间和方式,所以无论如何都是这样。用户的repo将只包含合理数量的分支,但web应用程序将访问的主repo将包含所有分支(作为远程分支)。1)“所有wiki页面都在同一目录中”是我可以控制的。没有任何东西阻止我在路径“Su/pe/rc/oo/lpage”下存储名为“supercolpage”的页面。2) 此外,git压缩所有四种对象类型:blob、commit、标记和树。它还对所有这些类型使用增量编码(但仅在一个类型中使用,因此从树1到树2可以,但从树到blob则不行,即使考虑到它们的内容,这样可以节省空间)。3) 二进制搜索会很困难,因为树对象中的文件名长度可变。(您在哪里查找条目42?“二进制搜索将很困难”-选择字节位置并扫描到下一个零字节。但是考虑到你的第一点,可能并不需要,散列也可能包含零字节(它是20字节的二进制,而不是40字节的十六进制)。所以这并不是那么简单。
retval = array();
foreach get_branch() as branch
    if (branch->get_tree()->lookup(name)) {
        retval[] += branch->get_name();
    }
}