如何嵌套git存储库;获取并合并

时间:2012-04-26 00:14:04

标签: git version-control git-merge git-fetch

所以我有两个git回购。第一个是我们的框架(想想数据库抽象,函数),然后是我们新项目的另一个git repo。

我想将框架git repo包含到项目git中,根据GitHub帮助,这应该有效:

 cd /project
 git remote add framework git://github.com/username/Framework.git
 git fetch framework
 git merge framework/master

问题是,当我进行合并时,它会从框架中提取所有文件,并将它们简单地转储到项目的根目录中。相反,我们如何将框架文件合并到像/project/framework/

这样的子目录中

1 个答案:

答案 0 :(得分:22)

您可能需要查看Git的submodule支持。子模块允许您在另一个git存储库中嵌入一个git存储库。这种事情有alternative solutions,但我自己没有使用它们。

示例可能如下所示:

$ git clone git://github.com/username/project.git
$ cd project
$ git submodule add git://github.com/username/framework.git framework
$ git commit -m "added framework submodule"

如果要克隆包含子模块的存储库,则需要使用--recursive选项:

$ git clone --recursive git://<repository-with-submodules>.git

或者,您可以定期克隆然后运行:

$ git submodule init
$ git submodule update

阅读链接文档(和git submodule --help)以获取更多信息。

如果对子模块进行了更改,则将它们带入:

# first update the submodule just like any other git repository
$ cd project/framework
$ git pull

# now you have to record the new commit in the parent repository
$ cd ..
$ git commit -m "updated framework submodule"

最后一步是必要的,因为git会保存与给定子模块关联的特定提交的记录(这样当任何人克隆父级时,他们将获得该子模块的版本,而不是其最新的修订版本,这可能会发生重大变化,阻止它与父存储库一起工作)。因此,如果更新子模块,则需要在父模块中记录新提交。

如果您在framework子模块中进行更改,您将再次git push,就像您使用任何其他存储库一样。然后,您必须在父模块中提交新版本。