如何组织我的Git代码库

6
我是一名有用的助手,能够翻译文本。

我面临以下问题,但没有答案:

我们有一个从SVN repo克隆而来的repo。 存储在该repo中的项目类似于各种项目使用的平台软件。 该repo的结构如下:

platform
  |- core
  |- additional

那个代码库的结构由于某些原因无法更改。 coreadditional 都包含作为该 platform 一部分的数据。
如果一个项目想要使用平台并添加一些功能,则在 additional 下创建一个新文件夹来包含源代码,并将该功能的头文件添加到 additional/includes 中。
目前,我们只是从 master 分支出新项目,所有内容都放在同一个代码库中。这导致了分支膨胀,我的(中央)代码库越来越大,因为所有单个项目中进行的提交都会进入中央代码库(我的同事们习惯了 SVN,所以他们几乎每次提交后都会执行 push -- 只是为了确保...)。
首先我想到的是子模块:将platform作为一个子模块保留在超级项目(称为super)下,然后进入super/platform/additional/mystuff,创建源文件并将其添加到super中。但显然这行不通,因为文件位于platform子模块内。
有没有更好的方法来组织我的仓库,以便:
  • 平台用户能够从中央仓库更新其工作副本
  • 并且平台用户能够将错误修复应用到platform的仓库中
  • 并且使用platform的项目不会破坏platform的仓库?

< p > 编辑1:高度耦合的git子模块涵盖了我所处的情况:紧密耦合的东西,只有我知道比绝对基础更多的git知识,“大多数开发人员只有非常肤浅的git知识”。完美匹配!
< p > < em >编辑2
:虽然Michael的答案看起来很有前途,但我认为它有点太复杂了。我正在寻找一些非常简单的东西,不需要那么多的交互。
1个回答

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 的本地分支,该分支是平台仓库主分支的克隆:

$ git checkout -b central platform/master

您可以使用git branchgit status来随时检查您所在的分支。现在您可以进行更改并将它们提交(到中央,即您所在的位置)。由于central连接到platform/master(请检查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:基本合并冲突

如果您不想更改平台存储库,但想将其更改合并到您的项目中,请使用

$ git remote add platform /path/to/platform
$ git fetch platform
$ git merge platform/master
git remote add仅在首次合并时需要,其他两个命令始终是必需的。
关于合并的部分基于Pro Git Book,其授权协议为cc-by-sa。本文的所有其他内容均可视为公共领域。

更新了我的问题,清理了对“master”(分支)和中央(仓库)的使用。感谢提示。 - eckes
+1 表示提供了一个合理的解决方案。但我担心我无法向同事推销这个工作流程... - eckes
我知道对于svn用户来说,这听起来很不常见。但是我认为它并没有听起来那么复杂。你可以提供一个脚本来在开发者端进行设置。然后他/她只需要处理两个分支,即mastercentral,以及它们之间的合并。此外,git pushgit pull在两个分支中都可以无需任何参数地使用。我认为如果你想保持你的中央仓库干净,你必须使用至少两个分支。 - Michael
中央项目仓库也可以是_central platform repository_的一个分支。只需克隆中央平台repo git clone /path/to/platform,创建一个新分支,例如_project-XYZ_,并使用git push origin project-XYZ将其推送到中央repo。这样也可以保持_central_的_master分支干净,但我认为它不太灵活。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接