git - 我如何组织我的 Git 仓库

标签 git layout repository

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

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

platform
  |- core
  |- additional

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

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

目前,我们只是从 master 分支出新项目,所有内容都进入同一个 repo。这导致分支膨胀并且我的(中央) repo 增长越来越多,因为在单个项目中所做的所有提交都转到中央 repo (我的同事习惯了 SVN,所以他们 push几乎在每次 commit 之后——只是为了确定……)。

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

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

  • 平台的用户可以从中央仓库更新他们的工作副本
  • AND 该平台的用户能够将错误修复应用到 platform 的 repo
  • 使用platform 的项目不会弄乱platform 的repo?

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


编辑 2: 而来自 Michael 的答案看起来很有前途,我认为它使用起来有点太复杂了。我正在寻找不需要那么多交互的非常简单的东西。

最佳答案

我发现你对 master 的用法有点困惑,我从来不知道 您是指整个平台存储库还是仅指其 主分支。

我的解决方案如下:

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

中央平台存储库

这是只有平台代码去的地方。使用例如你的 现有的 repo 协议(protocol)作为起点。

中央项目存储库

这是平台存储库的克隆,保留了所有代码 的一个项目。初始化它

$ git clone --bare /path/to/platform

开发者的本地仓库

初始化

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

$ git clone /path/to/project

对项目进行更改

现在,进行更改、提交并将它们推送到项目 裸 repo 。

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

将其他开发人员所做的更改 pull 到项目裸仓库 通过使用 git pull

对平台进行更改

由于您还想对平台本身进行更改,因此您也 需要一种方法来访问平台 repo 协议(protocol)。所以你把它添加为 远程 repo 到您的本地 repo :

$ 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。现在您进行更改并提交它们(到 中央,你所在的地方)。因为 central 连接到 platform/master (checkout cat .git/config) 你可以推送你的 只需使用 git push 即可更改平台存储库。还 git pull 无需任何其他参数即可工作。

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

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

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

首先更改您的平台分支并 pull 入新版本 平台的:

$ git checkout central
$ git pull

现在回到你的项目分支并 merge 在 将平台放入您的项目分支。

$ 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.

打开有冲突的文件,解决它们,将它们添加到 暂存区并提交 merge :

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

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

$ git push

关于 merge 冲突的更多信息:Pro Git: Basic Merge Conflicts

如果你不想改变平台 repo 协议(protocol),但 merge 从那里更改为您的项目使用

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

只有在第一次 merge 时才需要 git remote add。 其他两个始终是必需的。


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

关于git - 我如何组织我的 Git 仓库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6680768/

相关文章:

java - 如何将对象设置在画面中央?

database - GitHub 是如何存储你的仓库文件的?

GitKraken 与 git-crypt 的互操作性

git - "You' 已成功验证,但 GitHub 不提供 shell 访问” 在运行完所有 ssh 设置步骤后

git - 为什么 git 不能按路径进行硬/软重置?

Git + Arc Diff & Repairing Diffs(一直在 [master] 工作!)

git - 如何在 golang 的一个存储库下相互导入包?

python - 如何为类似NodeJs的python项目设置开发环境

android - 在具有恒定覆盖的 View 之间滑动

php - Magento 自定义模块, fatal error : Call to a member function setFormAction()