2012-04-26 73 views
8

所以我有两个git回购。首先是我们的框架(思考数据库抽象,函数),然后是我们新项目的另一个git仓库。如何嵌套git存储库;取和合并

我想包括框架混帐回购协议到项目的git,并根据GitHub的帮助,这应该工作:

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

问题是,当我做了合并,它带来的一切所有文件框架,并简单地将它们转储到项目的根目录中。相反,我们如何将框架文件合并到像/project/framework/这样的子目录中?

回答

20

你可能想看看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" 

的最后一步是必要的,因为混帐保持特定犯了一个给定的子模块相关的记录(这样,当任何人克隆父母,他们将获得该子模块的版本,而不是其最新版本,该版本可能会发生破坏性更改,从而阻止其按照预期与父库一起工作)。因此,如果更新子模块,则需要在父级中记录新的提交。

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

+0

完美,所以当对框架进行更改时,我该如何将它们拉入项目中,现在它已成为模块?另外,如果我对Framework进行更改而不是项目,那么如何将这些更改回到Framework git库中? – Justin 2012-04-26 00:23:21

+0

我已经更新了我的答案。 – larsks 2012-04-26 00:25:58

+0

一个小纸条。子模块HEAD已分离,因此您需要小心在子模块中进行更改。创建一个分支(或切换到分支),进行更改,提交然后推送。 – GoZoner 2012-04-26 03:10:32