2014-10-20 117 views
6

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

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

由于这些项目可以得到新的更新,我想合并这些更改。我还需要维护一个回购,但是当我将更改推送到Github时,它只会显示主回购库中的更改。

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

例如:

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

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

我在命令行输入grunt install来下载此回购。它不创建子模块,但克隆回购到我的文件夹,随后由我的主git回购忽略。

这个问题可能看起来不清楚,但我尽力解释问题。

在坚果壳:

  • 我不仅希望执行两个主而这任何其他有关回购的变化,但拉和合并的其他回购,还有,当他们的更新可用。

  • 我还需要维护我的项目的远程回购。

回答

6

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

其实,你确实有一个子模块。这是一个嵌套的存储库,和(我对此很认真),只要你需要了解grok子模块,那就是所有的都有子模块。要理解子模块,想象你有一个嵌套的存储库(你这样做)并考虑管理需求,需要做什么才能在dvcs中支持该设置。

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

你如何告诉人们提取你的提交在哪里得到必要的子项目提交?显然,你必须在提交的文件的某个地方放下一个注释,说“这里是一个回购,应该有任何需要的$子项目提交”。 git submodule已经在.gitmodules作为存储这样的笔记的传统地点进行结算。

接下来:呃,如果你交给他们的网址离线,别人怎么办?他们显然需要使用另一个回购。因此,.gitmodules只是建议,git submodule命令使用您的.git/config中的当前值,其中git submodule init已从建议的.gitmodules中填充。

git submodule的操作是全部这样。忘掉它。除非你需要一点帮助来做你已经发现的事情,否则你甚至都不会去看命令。从知识开始,简单的事实是,子模块只不过是一个嵌套的回购,而使用它的项目提交的只是一个提交ID,它应该在嵌套回购的某处。而已。这就是一个子模块。

当您在需要做的繁琐任务中运行时,请查找git submodule子命令,它可以为您执行这些任务。您不必使用子命令。所有子命令正在做的是自动执行简单的任务,否则会很费力。它是一个工具包,可以做任何你需要做的事情,而且它不可能或者应该对世界上每个人施加一些任意和充分的(这是困难的部分)抽象。所以这是一个抓包。

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

为了让您当前拥有的仓库能够完成最初的吊装,请将其从当前仓库中移出,然后从任何位置进行添加和更新,然后修复.gitmodules中的上游网址以方便其他人。

那里。现在,您知道了解git子模块所需知道的一切,并且只是在您发现需要时逐步获取详细信息,才能了解命令为您做了什么,以及为什么您实际上不必关心如何理解每一个小问题事先在它的手册页上。至少,我是这么认为的。

如果我错过了任何重要的事情,我会很高兴(温柔或钝,我真的不在乎)更正评论。