我遇到以下问题但没有答案:
我们有一个从SVN回购克隆的回购。存储在该repo中的项目类似于各种项目使用的平台软件。回购的结构是这样的:
platform
|- core
|- additional
由于某些原因,无法更改该回购的结构。 core
和additional
都包含属于platform
的数据。
如果项目想要使用该平台并添加一些功能,它会在additional
下创建一个包含源的新文件夹,并将该功能的标题添加到additional/includes
目前,我们只是从master
分支新项目,一切都进入同一个回购。这导致分支膨胀,我的(中央)仓库越来越多,因为在单个项目中提交的所有提交都转到中央仓库(我的同事习惯了SVN,所以他们push
几乎在每个commit
- 只是为了确保......)。
首先我想到的是submodules:将platform
作为超级项目(称为super
)下的子模块,然后转到super/platform/additional/mystuff
,在那里创建源代码,将它们添加到super
。但这显然不起作用,因为文件在platform
子模块中。
有没有更好的方法来组织我的回购,以便:
platform
platform
的项目不会搞砸platform
的回购?编辑1 :Highly coupled git submodules涵盖了我所处的相当多的场景:紧密耦合的东西,我唯一知道比git的绝对基础更多的东西,“大多数开发人员只有粗略的git知识“。完美匹配!
编辑2 : 虽然Michael的答案看起来很有希望,但我认为它使用起来有点过于复杂。我正在寻找一些不需要太多交互的非常简单的事情。
答案 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 master
和git 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许可。这篇文章的所有其他内容可能是 被视为公共领域。