组合在git存储库中的子项目中增长的基础项目,git子模块或子树合并方法除外

组合在git存储库中的子项目中增长的基础项目,git子模块或子树合并方法除外,git,combinations,git-submodules,repository,Git,Combinations,Git Submodules,Repository,将来有一些子项目:“项目1”、“项目2”等等 还有一个项目叫做“基础项目”,它是其他项目的基础。“基础项目”是一个内容管理系统(CMS) 所有项目都有自己的git存储库 “项目1”、“项目2”和其他项目使用“基础项目”来发展和壮大 git中有一些方法,如子模块或子treemerge。但似乎不适合这里。 不应将“基本项目”克隆到子目录中。它在根目录中。它在“项目1”或“项目2”中成长 当我在子项目中工作时,我必须能够将“基本项目”更改单独推送到它自己的存储库中,以获取其他子项目 我能做什么?子树合

将来有一些子项目:“项目1”、“项目2”等等

还有一个项目叫做“基础项目”,它是其他项目的基础。“基础项目”是一个内容管理系统(CMS)

所有项目都有自己的git存储库

“项目1”、“项目2”和其他项目使用“基础项目”来发展和壮大

git中有一些方法,如子模块或子treemerge。但似乎不适合这里。 不应将“基本项目”克隆到子目录中。它在根目录中。它在“项目1”或“项目2”中成长

当我在子项目中工作时,我必须能够将“基本项目”更改单独推送到它自己的存储库中,以获取其他子项目


我能做什么?

子树合并或子模块用于:两个不同但一致的文件集组合在一起。
每一组文件都位于自己的目录中,因为它们可以单独分支或标记(子模块),也可以合并在一起(子树合并,同时保持获取自己历史记录的能力)。
不过,两者都需要一个单独的目录

但您所描述的(“
Base Project
”位于根目录中,生长在“
project1
”或“
project2
”)是关于一个:所有组件合并到一个大组件中:一个大文件集,它将始终作为一个单元一起发展。
因此,每个项目可以有一个分支:
branch1
用于
CMS-projet1
branch2
用于
CMS-project2
,等等

但是,如果您需要向原始(和单独的)回购协议报告
projectx
特定的修改或CMS特定的修改,则在专用分支机构中进行所述特定更改,然后合并这些更改:

  • branchp1
    适用于影响
    project1
  • branchc1
    适用于影响
    CMS
  • branch1
    将是从
    branchp1
    branchc1
(分支2的情况与之相同)

然后,您可以将这些更改导出为修补程序:

  • branchp1
    project1
    repo
  • branchc1
    CMS
    repo
不方便的是,Git不会记住已经合并回原始回购协议的内容,但这将允许您将
CMS projectx
文件集中开发的常见历史报告回原始
CMS
projectx
回购协议


注意:如果您不想管理2个额外的分支,另一个解决方案是:

  • 确保每次提交仅包括CMS修改或项目修改
  • 留下有助于区分它们的提交消息(“
    [CMS]我的CMS修改注释…
    ”,或“
    [Project1]我的Project1修改注释…
  • 使用导出为修补程序,只有正确的提交

补丁导出示例(如中所述):感谢您提供完整答案@vonc:),我认为这应该是解决此问题的一种方法。你能不能给我解释一下,你是如何只对一个特定的分支进行一些更改的?例如,
A文件
应推送到
branchp1
B文件
应推送到
branchc1
。将
A文件
推送到其分支后,当尝试将
B文件
提交到
branchc1
时,它会使
A文件
也推送到
branchc1
。我在这里理解有问题…@Hallaji基本上,每次修改CMS时,你都会在
branch1
上重新设置CMS分支
branch1
,切换到它(签出),进行修改,提交,切换回
branch1
并将
branch1
合并到它。现在,我意识到它是复杂的,因此一个更简单的解决方案是继续执行
branch1
,并根据每个提交的性质选择正确的提交到
branchc1
branchp1
(有关cherry picking的更多信息,请参阅)。想法仍然是:有两个分支记录CMS或特定于项目的提交。@Hallaji如果除了常规的
branch1
之外还有这些分支,那么您可以将这些提交导出为补丁,并将它们应用于相应的存储库(CMS和
project1
)。如果每个项目只有一个分支,那么不同性质的提交会混合在一起,这无助于将它们导出回初始回购。谢谢