繁体   English   中英

git repo子文件夹作为另一个repo的子树?

[英]Git repo subfolder as subtree of another repo?

我的公司正在努力从SVN迁移到Git-部分原因是要利用以Git为源的部署软件。 我们正在为应用程序堆栈的所有组件使用单个存储库(monorepo)。

我们也正在考虑将PM2用于NodeJS应用程序管理/部署。 由于它可以使用git存储库来部署更新,因此我们很乐意使用它-但实际上只需要部署存储库的一个子目录。

是否可以创建一个git存储库,该存储库仅将另一个git repo的单个子目录作为子模块/子树引用?

这样-仓库A是主要的monorepo,仓库B是仅包含仓库A中的NodeJS内容的仓库。

RepoA\
  Component1\
  Component2\
  DelphiApp\
  NodeJSApp\
  PHPStuff\
  Configurations\
  Utilities\
RepoB\
  NodeJSApp\ <--subtree/submodule back to NodeJSApp in RepoA

对于git submodule ,简短的回答是:

  • 您要么有一个存储库,要么没有。

    • 如果您没有存储库,则可以克隆它,现在可以了。 但你有仓库 ,而不是仓库一些子目录。
  • 现在您已经有了存储库,或者在其中进行了提交,或者没有。

    (提交由哈希ID识别(哈希ID是那些难看的字母和数字大字符串),并且由于人类不善于记住随机的字母和数字字符串,并且出于其他目的,每个存储库都有一组名称 ,每个名称都记住一个哈希ID。名称对有好处,但是Git 真正需要的是哈希ID。)

    • 如果您没有提交,则可以将您的Git连接到另一个也具有存储库的Git。 您的Git可以询问他们的Git有关您拥有的,您没有的提交,并将这些提交放入您的Git存储库。 现在,如果他们有提交,您也可以。
  • 现在您有了存储库和提交,就拥有了所有文件。 提交是(或更准确地说,包含/引用并获得) 每个文件的完整快照。

您不必使用所有文件。 您只能提取您关心的文件。 但这比仅使用git checkout name来获取其哈希ID存储在name name的提交要困难得多,这将获取所有文件。 更简单的方法可能就是方法。

其他选择

请注意,Git具有处理子树的各种过程。 他们中有些人被捕获到称为贡献脚本git subtree ,对此有一个教程在这里 ,似乎OK(快速浏览)。 现在使用git subtree拆分库,然后可以得到所需的内容。 我一般不建议使用子树-最好将“类似库的”代码拆分为一个完全独立的存储库。

然后,您可以使用多个非常简单的独立存储库,也可以使用git submodule从具有所有其余代码的“ using-library”存储库中的“ library”存储库中选择特定提交,或者在“仅获取子模块”超级项目中,该项目同时具有“使用库”和“提供库”存储库作为其(现在是两个)子模块。 也就是说,您有:

  • 超级项目:包含Component1/*Component2/*DelphiApp/*PHPStuff/*Configurations/*Utilities/* ,并引用子模块NodeJSApp/ ,以及
  • 库:包含文件* ,这些文件将NodeJSApp/在超级项目控制的NodeJSApp/目录中

或者,您有:

  • superproject: 引用子模块app/ ,并且引用子模块app/NodeJSApp/

  • app:一个Git存储库,其中包含Component1/*Component2/*等,但根本不引用NodeJSApp/ 超级项目会将它们提取到app/以便其全名将为app/Component1/*app/Component2/*等。

  • 库:一个Git存储库,其中包含构成库的名为*文件。 超级项目会将它们提取到app/NodeJSApp/以便其全名将为app/NodeJSApp/*

除了被迫在第二种方法中在app/下查找所有内容之外,它们之间的唯一区别在于,使用第二种方法,您将独立管理两个独立的Git存储库-一个用于应用程序本身,一个用于库。 ,然后使用子项目会说: 从库中的Git仓库提取应用Git仓库散列应用程序 ,哈希LIB生成项目。 也就是说, 两个子项目都不需要知道Git-ness和哈希ID:只有超级项目才需要关心这一点。

使用第一种方法,您不需要app/顶层目录,但是现在您主应用程序中进行的每次提交都记录了哈希ID,Git应该在构建之前将Git提取到库子模块中。 如果更新库,则需要在超级项目中记录新的哈希ID。 这与以前相同,只是“超级项目” 应用程序本身 ,而不是仅包含两个子模块引用的第三个Git存储库。

比较常见的方法是两个Git存储库,它具有文件充当超级项目以在子模块中挑选特定的提交。 有时更方便。 有时,“一个监督其他所有项目的超级项目”方法更有意义 ,但这种情况绝对不常见。

是的你可以。 只是不要使用子模块。 子树或子仓库可以为您提供帮助。 您可以将'NodeJSapp'设为repoA中的子树或子仓库。 它将有效地将目录映射到相应的单目录存储库。

这样,您就可以将repo A用作主要操作,并在整个树上(包括NodeJSApp目录)进行原子操作(例如分支)。 您需要定期将其推入RepoB。 子模块不能以这种方式工作。 子树可以,但是在某些方面是有限的。 Subrepos可能是最佳的开源选择。

也有一些自定义方法可以做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM