维护包含其他克隆git repo的git repo

时间:2014-10-20 17:34:35

标签: git github version-control

我正在使用Sharelatex(github)在网站上工作,但它包含用于构建主项目的其他存储库。我克隆了主存储库并执行了用于下载这些存储库的grunt install

但问题是我需要更改主存储库和下载的存储库中的代码。

由于这些项目可以获得新的更新,我也希望合并这些更改。我还需要维护一个仓库,但是当我将更改推送到Github时,它只显示主仓库的变化。

我在git中遇到submodules,但由于主项目不包含任何子模块类型,我无法使用它。

例如:

主项目中使用了回购web。我首先在web的文件中进行一些编辑。我需要这些更改反映在我的远程存储库中,以便其他人可以使用它们。

现在假设一段时间后web repo的重要更新可用,我应该如何使用它?

我在命令行中输入grunt install来下载此回购。它不会创建一个子模块,而是克隆到我的文件夹中,然后我的主git仓库会忽略它。

这个问题似乎不清楚,但我尽力解释这个问题。

在坚果壳中:

  • 我不仅希望在主要和任何其他回购协议中执行更改,还要在其更新可用时拉动并合并其他回购。

  • 我还需要维护项目的远程仓库。

1 个答案:

答案 0 :(得分:6)

  

我正在使用Sharelatex(github)开发一个网站,但它包含用于构建主项目的其他存储库。 [...]我在git中遇到了子模块,但由于主项目不包含任何子模块,我无法使用它。

实际上,你确实有一个子模块。这就是一个嵌套的存储库,并且(我对此很认真)到目前为止您需要了解的grok子模块,那就是 all 还有子模块。要了解子模块,假设您有一个嵌套的存储库(您这样做)并考虑管理要求,需要采取哪些措施来支持dvcs中的设置。

对于初学者来说,当人们克隆一个使用来自某个仓库的子模块的项目时,你们都决定包含已发布的提交,那个克隆显然也不会获得子项目存储库(当然它不应该让你的私有和上帝知道 - 它已经完成了它的版本)。因此,他们还必须从其自己发布的某个存储库中获取子项目仓库。

你如何告诉人们提交你的提交在哪里获得必要的子项目提交?显然,你必须在一个提交文件中的某处放一个注释,说“这里有一个应该有任何需要的子项目提交的仓库”。 git submodule已定居.gitmodules作为存储此类备注的传统位置。

接下来:嗯,如果您递送的网址脱机,其他人可以做什么?他们显然需要使用另一个回购。因此,.gitmodules只是建议,git submodule命令使用.git/config中的当前值,git submodule init已从.gitmodules`中的建议值填充。

git submodule的操作 all 就像这样。忘掉它。在你需要一些帮助做你已经发现需要做的事情之前,甚至不用费心去查看命令。从知识开始,简单的事实是,子模块只不过是一个嵌套的repo,而使用它的项目只提交一个应该在嵌套repo中的某个地方的提交id。而已。这都是子模块。

当您遇到需要执行的繁琐任务时,请查找为您执行这些操作的git submodule子命令。您不必使用子命令。所有该子命令正在做的是自动化直接的任务,否则将是费力的。它是一个工具包,可以做任何你需要做的事情,而且世界上没有任何办法可以或者应该对世界上每个人施加一些任意和充分的(和 - 那是困难的部分)抽象。所以它是一个抓包。

也就是说,当git submodule update为你做git submodule add时,有一个重要的安全游戏git clone.git。存储库通常具有[sub]项目下的实际repo内容toplevel .git,但是如果你检查出那个没有该子项目的分支,或者需要或希望该子项目消失,那么它的git submodule update也会消失 - 不是你想要的,不仅仅是你的签出内容,而是整个实际的回购。因此,当.git执行其初始克隆时,它会将子模块的.git目录提升到包含项目的repo中的一个方便(且任意)的小角落中,并替换刚刚移出的.git目录带有.gitmodules文件的子模块,其中包含移动目录的相对路径。

要在您当前拥有的仓库上完成初始提升,请将其从当前仓库中移出,在您放置的任何位置添加和更新,然后在git submodule中修复上游URL以方便其他

有。现在你完全了解了解git子模块所需要知道的一切,并且只有在你发现需要时才能逐步获取细节,了解{{1}}命令对你做了什么,以及为什么你实际上不需要关心关于理解其前面的手册页上的每一件小事。至少,我是这么认为的。

如果我错过了任何重要内容,我会很高兴(温和或直率,我真的不在乎)评论中的更正。