如果fork很大,你如何将fork与父项目同步?

时间:2018-04-05 13:41:09

标签: git architecture open-source project

这是一个理论问题,我只想为自己说清楚。

假设您从客户处获得了一项重要任务。让它成为一个带有铃声和口哨声的自定义浏览器,或者带有大量客户服务的自定义Android ROM。

经过一些研究,您发现可以使用一些开源项目作为地下室,但客户的愿望清单要求您进行大量更改,包括添加或删除大量代码,从项目中删除一些模块,更改架构一些组件,重写项目核心内容等等。

现在假设您已成功实施了所有内容,客户向您提供了资金并提出了将代码库与当前父项目状态同步以进行额外付款的要约。

现在的问题是:在以下情况下,将代码库与父代同步的最佳方法是什么:

  1. 你正在使用一些版本控制系统(我个人对git感兴趣,但如果有其他解决方案,我想知道)
  2. 您的开发持续了几年,而父项目并没有停滞不前,而且您没有从中获取更改,因为合同中没有相关内容。
  3. 您对未来支持该项目一无所知
  4. 你做了很多改变,简单的git merge会产生很多冲突,解决它们类似于从头开始重写所有内容
  5. 你不愿意花一辈子来转移这些变化。
  6. 如果无法进行快速合并,那么在架构方面避免这些情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

实际上,Git可能是你最好的选择。它有很多很棒的合并工具。如果原始项目是一个git fork,那么你很好,从当前的代码库创建一个新的分支,然后合并你的更改,或者做一个rebase。这将是缓慢,痛苦的,并且可能需要一次进行一次提交。希望你写了很多单元测试来找到你的失败。学习git-bisect,它将挽救你的生命(确定你的提交流中什么时候出现问题)。

回应你的评论,大型项目分叉其他大项目:

(1)尝试真的很难保持他们的变化模块化并超出父应用程序的核心功能

(2)定期进行合并或重新定位的过程。

无论从逻辑角度来看,您都必须解决所有冲突,而且可能会花费昂贵且耗时。

答案 1 :(得分:1)

理想情况下,当您使用开源项目作为基础时,您应该选择具有出色扩展机制的项目并与其保持同步。听起来这个项目已达到合并可能非常困难的程度。除了进行合并之外,另一个选择是使用git启动一个新项目来进行源代码控制,一个适合该语言的构建工具和一个对开源项目的依赖。一旦你有了这个设置,慢慢添加你建立的现有功能,但这次是以可扩展的方式,你仍然可以重用你的旧代码。随时编写大量单元测试,并经常更新开源项目的版本。

如果您打算尝试合并地狱,我建议您尝试分阶段从开源项目中删除更改,而不是使用不远离什么的构建获得最新的开始你用作基础并逐步更新,从而修复重大变化。根据您的技能水平,这可能是更多的工作,并且仍然使您处于具有未正确设置依赖项的项目的位置。