我的公司正在努力从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
答案 0 :(得分:0)
对于git submodule
,简短的回答是“否”:
您要么有一个存储库,要么没有。
现在您已经有了存储库,或者在其中进行了提交,或者没有。
(提交通过哈希ID识别,即那些丑陋的字母和数字大字符串,并且由于人类不善于记住随机的字母和数字字符串,并且出于其他目的,每个存储库都有一组名称,每个都记住一个哈希ID。名称对 you 很有用,但是Git 真正真正需要的是哈希ID。
现在您已经有了存储库和提交,您已经拥有了 all 个文件。提交是(或更准确地说,包含/引用并获取)每个文件的完整快照。
您不必使用所有文件。您只能提取您关心的文件。但这要比仅使用git checkout name
来获取其哈希ID存储在名称 name
中的提交要困难得多,这将使您 all 。更简单的方法可能就是方法。
请注意,Git具有处理子树的各种过程。其中一些被捕获到一个名为git subtree
的贡献脚本中,为此,有一个教程here看起来不错(快速浏览)。现在使用git subtree
拆分库,然后可以即可获得所需的内容。不过,我一般不建议使用子树-最好将“类似库的”代码拆分为一个完全独立的存储库。
然后,您可以使用多个非常简单的独立存储库,也可以使用git submodule
从“库”存储库中的所有库中选择特定的提交,而“库”具有代码的其余部分,或在“仅获取子模块”超级项目中,该库同时具有“使用库”和“提供库”存储库作为其(现在是两个)子模块。也就是说,您有:
Component1/*
,Component2/*
,DelphiApp/*
,PHPStuff/*
,Configurations/*
和Utilities/*
,并且指的是< / em>子模块NodeJSApp/
加上*
,这些文件将位于超级项目控制的NodeJSApp/
目录中或者,您有:
超级项目:引用子模块app/
,而引用子模块app/NodeJSApp/
app:一个包含Component1/*
,Component2/*
等的Git存储库,但根本没有引用NodeJSApp/
。超级项目会将它们提取到app/
,以便其全名分别为app/Component1/*
,app/Component2/*
等。
库:一个Git存储库,其中包含构成该库的名为*
的文件。超级项目会将它们提取到app/NodeJSApp/
,以便其全名将为app/NodeJSApp/*
。
除了第二种方法被迫在app/
下查找所有内容之外,它们之间的唯一区别在于,使用第二种方法,您将管理两个独立的Git存储库-一个用于应用程序本身,另一个用于管理应用程序。一个独立的库,然后使用超级项目说:通过从app Git存储库中提取hash app 和从库中提取hash lib 来构建项目Git存储库。也就是说,两个子项目都不需要了解Git-ness和哈希ID:只有 superproject 才需要关心它。
使用第一种方法,您无需使用app/
顶级目录,但是现在您在主应用程序中 进行的每次提交都记录了一个Git应该提取的哈希ID。库子模块,然后再构建。如果更新库,则需要在超级项目中记录新的哈希ID。这与以前相同,除了“超级项目” 是 应用本身,而不是仅包含两个子模块引用的第三个Git存储库。
具有两个文件和的两个Git存储库是一种超级项目,可以在子模块中挑选出特定的提交,这是较常见的方法。有时更方便。有时,“一个监督其他所有项目的超级项目”方法会产生更多的感觉,但这种情况肯定不那么常见了。
答案 1 :(得分:0)
是的,可以。只是不要使用子模块。子树或子仓库可以为您提供帮助。您可以将'NodeJSapp'设为repoA中的子树或子仓库。它将有效地将目录映射到相应的单目录存储库。
这样,您就可以在整个树(包括NodeJSApp目录)上通过原子操作(例如分支)将repo A用作主要操作。您需要定期将其推入RepoB。子模块不能以这种方式工作。子树可以,但是在某些方面是有限的。 Subrepos可能是最佳的开源选择。
也有一些自定义方法。