我如何组织我的Git仓库

时间:2011-07-13 14:44:47

标签: git layout repository

我遇到以下问题但没有答案:

我们有一个从SVN回购克隆的回购。存储在该repo中的项目类似于各种项目使用的平台软件。回购的结构是这样的:

platform
  |- core
  |- additional

由于某些原因,无法更改该回购的结构。 coreadditional都包含属于platform的数据。

如果项目想要使用该平台并添加一些功能,它会在additional下创建一个包含源的新文件夹,并将该功能的标题添加到additional/includes

目前,我们只是从master分支新项目,一切都进入同一个回购。这导致分支膨胀,我的(中央)仓库越来越多,因为在单个项目中提交的所有提交都转到中央仓库(我的同事习惯了SVN,所以他们push几乎在每个commit - 只是为了确保......)。

首先我想到的是submodules:将platform作为超级项目(称为super)下的子模块,然后转到super/platform/additional/mystuff,在那里创建源代码,将它们添加到super。但这显然不起作用,因为文件在platform子模块中。

有没有更好的方法来组织我的回购,以便:

  • 该平台的用户可以从中央仓库更新其工作副本
  • AND 该平台的用户可以将错误修复应用于platform
  • 的回购
  • AND 使用platform的项目不会搞砸platform的回购?

编辑1 Highly coupled git submodules涵盖了我所处的相当多的场景:紧密耦合的东西,我唯一知道比git的绝对基础更多的东西,“大多数开发人员只有粗略的git知识“。完美匹配!


编辑2 : 虽然Michael的答案看起来很有希望,但我认为它使用起来有点过于复杂。我正在寻找一些不需要太多交互的非常简单的事情。

1 个答案:

答案 0 :(得分:6)

我发现你对master的使用有点混乱,因为我从来不知道 你是指整个平台存储库还是仅仅意味着它 主分支。

我对此的解决方案如下:

  • 您有平台的一个中央存储库。
  • 每个项目都有一个中央存储库
  • 每个开发人员都有他/她自己的本地存储库。

中央平台存储库

这是只有平台代码才能进入的地方。使用例如您的 现有的回购作为起点。

中央项目存储库

这是平台存储库的克隆并保留所有代码 一个项目。用

初始化它
$ git clone --bare /path/to/platform

开发人员的本地存储库

初始化

作为开发人员,您首先要克隆项目存储库。

$ git clone /path/to/project

对项目进行更改

现在,进行更改,提交更改并将其推送到项目中 裸仓库。

$ editor some-file
$ git add -p some-file
$ git commit
$ git push

将其他开发人员所做的更改拉到项目中 使用git pull

对平台进行更改

您还希望对平台本身进行更改 需要一种方法来访问平台仓库。所以你把它添加为 远程回购到您当地的仓库:

$ git remote add platform /path/to/platform
$ git fetch platform

正如您现在可以看到git branch -a,您的本地回购知道 关于平台。现在你想对它做一些改变 平台。首先,您创建一个本地分支 central ,它是一个 克隆平台repo的主分支:

$ git checkout -b central platform/master

您可以随时使用git branch查看您所在的分支 或git status。现在你进行更改并提交它们(到 中央,你在哪里)。当中央连接到 platform / master (checkout cat .git/config)你可以推动你的 只需使用git push即可更改平台回购。也 git pull没有任何其他参数。

使用git checkout mastergit checkout central进行更改 在你的分支之间。

在您的项目中获取新的平台版本

注意: 您需要完成上一部分的工作

首先更改您的平台分支并提取新版本 平台:

$ git checkout central
$ git pull

现在返回项目分支并合并所做的更改 平台进入您的项目分支。

$ git checkout master
$ git merge central

如果发生冲突,会发生类似的事情:

$ git merge central
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

打开包含冲突的文件,解决它们,将它们添加到 暂存区域并提交合并:

$ editor index.html
$ git add index.html
$ git commit

现在将您的更改推送到项目的裸仓:

$ git push

有关合并冲突的更多信息:Pro Git: Basic Merge Conflicts

如果您不想更改平台repo,而是合并 从那里改变到你的项目使用

$ git remote add platform /path/to/platform
$ git fetch platform
$ git merge platform/master

只有在您第一次合并时才需要git remote add。 其他两个总是需要的。


关于合并的部分基于Pro Git Book 根据cc-by-sa许可。这篇文章的所有其他内容可能是 被视为公共领域。