在git中的一个根文件夹中使用两个存储库?

时间:2015-03-04 22:55:46

标签: git

假设我有一个项目,其中包含一组文件,这些文件将用作我所有其他项目的基础,该项目有自己的本地和远程存储库

我想要做的是克隆这个基础仓库并开始为我的新项目做我的东西,所以我创建了一个新的本地和远程仓库。但是明天我在一个属于“基础”项目的文件中发现了一个错误我希望在这里更改它并推送到“基础”repo只有与该项目相关的文件,我该如何实现?

1 个答案:

答案 0 :(得分:3)

首先,您不需要像问题标题所示,在同一目录中使用这两个存储库。

您似乎已经有两个项目basederived,两个都有遥控器(我称之为rbaserderived)。我看到了你想要的两个好方法:

多个遥控器

Git可以使用为每个克隆配置的多个遥控器。如果derived目录结构与base结构完全相同,这是一个很好的解决方案。

因此,您的base克隆有一个远程配置(origin),指向rbase服务器。它有一些常见文件提交。

derived克隆最初有一个远程配置(origin),与rderived服务器相关。 rderived服务器已创建为分支rbase,因此您的derivedbase中的相同提交开头。

现在,您将rbase添加为derived的遥控器:

git remote add base path/to/rbase
git fetch base

derived克隆,您可以从master访问base分支base/master,可以在此分支中开始一些工作,提交并将其推送到{{1 }}:

rbase

请注意,您必须在git push base local-branch-with-base-changes:master 的分支分支中工作(基于base或来自base/master的任何其他分支名称),否则,您无法推送它到base,因为它会推送base提交(并且可能是非快进)。为了使derivedmaster保持同步,需要进行一些合并提交。

有关详细信息,请参阅base/master

子模

Git还支持另一个存储库。如果git remote --help目录结构包含具有derived目录结构的某个目录,则此解决方案将起作用。在其他作品中,basebase的子目录,并且作为存储库,derivedbase git子模块

使用子模块时,子模块目录实际上是子模块存储库的简单克隆。在该目录中进行的所有更改实际上都是子模块存储库中的更改,而不是超级项目存储库中的更改。

derived

derived

然后,在编辑git submodule add path/to/rbase path/inside/derived/to/clone/base git submodule update 内的文件后,输入该目录,创建提交并推送它。其path/inside/derived/to/clone/base将指向origin

使用子模块,不需要合并提交。 rbase克隆derivedrbase之间的同步只是base中的提交,表示子模块的新derived

有关详细信息,请参阅HEAD