如果它很大,你如何与父项目同步?
How do you synchronize a fork with parent project if it is big?
这是一道理论题,我只是想自己弄清楚。
假设您从客户那里接到一项任务,要做一些大事。让它成为带有花里胡哨的自定义浏览器或带有大量客户服务的自定义 Android ROM。
经过一些研究,您发现您可以将一些开源项目用作地下室,但客户的愿望清单要求您进行大量更改,包括添加或删除大量代码、从项目中删除一些模块、更改一些组件的架构,重写项目核心的一些东西等等。
现在假设您已成功实施所有内容,客户给了您钱并提出要将代码库与当前父项目的状态同步以收取一些额外费用。
现在的问题是:将代码库与父级同步的最佳方式是什么:
- 您正在使用一些版本控制系统(我个人对 git 感兴趣,但如果有其他解决方案,我想知道)
- 你的开发持续了几年,而父项目并没有停滞不前,你也没有从中获取更改,因为合同中没有关于这一点的内容。
- 以后支持这个项目你就不知道了
- 您进行了如此多的更改,以至于简单的
git merge
会产生很多冲突,解决这些冲突类似于从头开始重写所有内容
- 你不会愿意一辈子都在转移变化。
如果没有快速合并的方法,在架构方面避免这些情况的最佳方法是什么?
Git 实际上可能是您最好的选择。它有很多很棒的合并工具。如果原始项目是一个 git 分支,那么你很好,从当前的 code-base 创建一个新分支,然后合并你的更改,或者做一个变基。这将是缓慢的、痛苦的,并且可能需要去 one-commit-at-a-time。希望你写了很多单元测试来发现你的失败。学习 git-bisect,它将挽救您的生命(确定您的提交流中出现问题的时间)。
为了回应您的评论,分叉其他大项目的大项目:
(1) 非常努力地保持他们的变化模块化并脱离父应用程序的核心功能
(2) 定期执行相同的合并或变基过程。
无论如何,从逻辑的角度来看,您将不得不解决所有的冲突,这可能会很昂贵并且 time-consuming。
理想情况下,当您使用开源项目作为基础时,您应该选择一个具有出色扩展机制的项目并保持最新。听起来这个项目已经到了合并可能非常困难的地步。除了经历合并地狱之外,另一种选择是使用 git 进行源代码控制、适用于该语言的构建工具和对开源项目的依赖来启动一个新项目。一旦你完成了这个设置,慢慢地添加你构建的现有功能,但这次是以一种可扩展的方式,你仍然能够重用你的旧代码。边走边写大量单元测试,并经常更新开源项目的版本。
如果您打算尝试合并地狱,我建议您尝试分阶段从开源项目中提取更改,而不是从与您使用的项目相差不远的构建中获取最新版本作为基础并从那里进行增量更新,随时修复重大更改。根据您的技能水平,这可能需要更多的工作,并且仍然会让您处于没有正确设置依赖项的项目中。
这是一道理论题,我只是想自己弄清楚。
假设您从客户那里接到一项任务,要做一些大事。让它成为带有花里胡哨的自定义浏览器或带有大量客户服务的自定义 Android ROM。
经过一些研究,您发现您可以将一些开源项目用作地下室,但客户的愿望清单要求您进行大量更改,包括添加或删除大量代码、从项目中删除一些模块、更改一些组件的架构,重写项目核心的一些东西等等。
现在假设您已成功实施所有内容,客户给了您钱并提出要将代码库与当前父项目的状态同步以收取一些额外费用。
现在的问题是:将代码库与父级同步的最佳方式是什么:
- 您正在使用一些版本控制系统(我个人对 git 感兴趣,但如果有其他解决方案,我想知道)
- 你的开发持续了几年,而父项目并没有停滞不前,你也没有从中获取更改,因为合同中没有关于这一点的内容。
- 以后支持这个项目你就不知道了
- 您进行了如此多的更改,以至于简单的
git merge
会产生很多冲突,解决这些冲突类似于从头开始重写所有内容 - 你不会愿意一辈子都在转移变化。
如果没有快速合并的方法,在架构方面避免这些情况的最佳方法是什么?
Git 实际上可能是您最好的选择。它有很多很棒的合并工具。如果原始项目是一个 git 分支,那么你很好,从当前的 code-base 创建一个新分支,然后合并你的更改,或者做一个变基。这将是缓慢的、痛苦的,并且可能需要去 one-commit-at-a-time。希望你写了很多单元测试来发现你的失败。学习 git-bisect,它将挽救您的生命(确定您的提交流中出现问题的时间)。
为了回应您的评论,分叉其他大项目的大项目:
(1) 非常努力地保持他们的变化模块化并脱离父应用程序的核心功能
(2) 定期执行相同的合并或变基过程。
无论如何,从逻辑的角度来看,您将不得不解决所有的冲突,这可能会很昂贵并且 time-consuming。
理想情况下,当您使用开源项目作为基础时,您应该选择一个具有出色扩展机制的项目并保持最新。听起来这个项目已经到了合并可能非常困难的地步。除了经历合并地狱之外,另一种选择是使用 git 进行源代码控制、适用于该语言的构建工具和对开源项目的依赖来启动一个新项目。一旦你完成了这个设置,慢慢地添加你构建的现有功能,但这次是以一种可扩展的方式,你仍然能够重用你的旧代码。边走边写大量单元测试,并经常更新开源项目的版本。
如果您打算尝试合并地狱,我建议您尝试分阶段从开源项目中提取更改,而不是从与您使用的项目相差不远的构建中获取最新版本作为基础并从那里进行增量更新,随时修复重大更改。根据您的技能水平,这可能需要更多的工作,并且仍然会让您处于没有正确设置依赖项的项目中。