![](/img/trans.png)
[英]how to migrate multiple branches of a subfolder to another repo with git subtree
[英]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 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.