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

Jus*_*tin 10 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
Run Code Online (Sandbox Code Playgroud)

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

lar*_*sks 23

您可能想要了解Git的子模块支持.子模块允许您在另一个git存储库中嵌入一个git存储库.对于这类事情有其他解决办法,但我自己并没有使用它们.

示例可能如下所示:

$ 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"
Run Code Online (Sandbox Code Playgroud)

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

$ git clone --recursive git://<repository-with-submodules>.git
Run Code Online (Sandbox Code Playgroud)

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

$ git submodule init
$ git submodule update
Run Code Online (Sandbox Code Playgroud)

阅读链接文档(和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"
Run Code Online (Sandbox Code Playgroud)

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

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