是否可以创建一个项目作为现有项目的前身?某种预分叉项目?
Is it possible to create a project to be the predecessor of existing projects? Some kind of pre-fork project?
我在前端架构部门工作,我们维护着几个骨架项目。在这些中,我们定义了其他团队用来启动他们自己的项目的基础知识。我们创建一些代码来使用 babel 启动一个 webpack devserver;我们使用 testem、chai 和 mocha 设置自动化测试;我们创建脚本来帮助生成一些配置文件。这一切看起来很酷,但有一个缺陷:从我们的骨架创建的项目不会从他们那里分叉,他们克隆骨架存储库,然后将他们的新项目推送到另一个存储库。
对我们的骨架项目的每次更改只会影响未来的项目,因为旧项目不会自动获得更改,甚至不会手动执行(这是我们目前正在努力强制执行的)。
所以,如果有这样的结构就好了:
basic-skeleton
|--amp-skeleton
| |--amp-project-1
| |--amp-project-2
|--react-skeleton
|--react-project-1
是否可以在项目创建后"fork relationship"创建这个项目,以便我们更新父项目,他们只需要合并这些更改?
It all seems cool, but there is one flaw: the projects created from our skeletons don't fork from them, they clone the skeleton repo and then push their new project to another repo.
但是 正在分叉。
Git是分布式系统。提交在存储库之间移动时保持其身份。如果他们克隆了您的存储库并将其推送到他们的存储库中,则分支具有共同的历史记录,因此他们可以随时从您的存储库中提取并将基线合并到他们的项目中。
GitHub、GitLab、BitBucket 和类似的“fork”操作只是一个server-side 克隆。如果他们手动执行克隆,存储库管理器将不知道它可以执行合并,因此他们可能也必须手动执行,但没有什么可以阻止它。
也就是说,合并与覆盖事物并不顺利。对于基线和构建在其之上的项目,通常最好将基线和自定义设置为由构建系统组合的某种层,基线作为 sumbodule 检出或由构建系统作为依赖项下载。
更新:
But I've learned that actually the new projects aren't created this way and thus they're not forks.
还有办法绕过它。包维护者(例如在 Debian 中)经常使用它来跟踪来自不同版本控制系统或 non-public 版本控制系统的上游版本的修改。它通过维护“上游”分支来工作:
项目(下游)存储库中的初始导入是骨架(上游)某些修订版的直接副本,然后在此基础上进行更改。当需要与较新的骨架(上游)合并时,将创建一个新分支(upstream
),将较新版本的骨架复制到其中并提交。然后将此分支合并到 master
中以引入更新的框架。
由于 3 向合并算法只关心当前状态和最近的共同祖先,而不关心两者之间的修订,所以即使您没有该历史记录也没关系。只是不要在之后丢失 upstream
引用,这样您可以在下次要合并新骨架时更新它。
此工作流甚至在 Git 之前就已使用,并且在那里更为重要,因为集中式系统无法像分布式系统那样在存储库之间复制历史记录。它甚至在 CVS 手册中被描述为“供应商分支”。它也是 Git 的明确设计 use-cases 之一,也是 Git 在合并期间猜测重命名而不是跟踪文件身份的重要原因——因为当导入 tarred/zipped release 到供应商分支,您没有重命名信息。
请注意,您可以通过明确编号的框架版本来显着帮助此工作流程。这样可以更轻松地跟踪在每个下游项目中导入和合并了哪个版本。
我在前端架构部门工作,我们维护着几个骨架项目。在这些中,我们定义了其他团队用来启动他们自己的项目的基础知识。我们创建一些代码来使用 babel 启动一个 webpack devserver;我们使用 testem、chai 和 mocha 设置自动化测试;我们创建脚本来帮助生成一些配置文件。这一切看起来很酷,但有一个缺陷:从我们的骨架创建的项目不会从他们那里分叉,他们克隆骨架存储库,然后将他们的新项目推送到另一个存储库。
对我们的骨架项目的每次更改只会影响未来的项目,因为旧项目不会自动获得更改,甚至不会手动执行(这是我们目前正在努力强制执行的)。
所以,如果有这样的结构就好了:
basic-skeleton
|--amp-skeleton
| |--amp-project-1
| |--amp-project-2
|--react-skeleton
|--react-project-1
是否可以在项目创建后"fork relationship"创建这个项目,以便我们更新父项目,他们只需要合并这些更改?
It all seems cool, but there is one flaw: the projects created from our skeletons don't fork from them, they clone the skeleton repo and then push their new project to another repo.
但是 正在分叉。
Git是分布式系统。提交在存储库之间移动时保持其身份。如果他们克隆了您的存储库并将其推送到他们的存储库中,则分支具有共同的历史记录,因此他们可以随时从您的存储库中提取并将基线合并到他们的项目中。
GitHub、GitLab、BitBucket 和类似的“fork”操作只是一个server-side 克隆。如果他们手动执行克隆,存储库管理器将不知道它可以执行合并,因此他们可能也必须手动执行,但没有什么可以阻止它。
也就是说,合并与覆盖事物并不顺利。对于基线和构建在其之上的项目,通常最好将基线和自定义设置为由构建系统组合的某种层,基线作为 sumbodule 检出或由构建系统作为依赖项下载。
更新:
But I've learned that actually the new projects aren't created this way and thus they're not forks.
还有办法绕过它。包维护者(例如在 Debian 中)经常使用它来跟踪来自不同版本控制系统或 non-public 版本控制系统的上游版本的修改。它通过维护“上游”分支来工作:
项目(下游)存储库中的初始导入是骨架(上游)某些修订版的直接副本,然后在此基础上进行更改。当需要与较新的骨架(上游)合并时,将创建一个新分支(upstream
),将较新版本的骨架复制到其中并提交。然后将此分支合并到 master
中以引入更新的框架。
由于 3 向合并算法只关心当前状态和最近的共同祖先,而不关心两者之间的修订,所以即使您没有该历史记录也没关系。只是不要在之后丢失 upstream
引用,这样您可以在下次要合并新骨架时更新它。
此工作流甚至在 Git 之前就已使用,并且在那里更为重要,因为集中式系统无法像分布式系统那样在存储库之间复制历史记录。它甚至在 CVS 手册中被描述为“供应商分支”。它也是 Git 的明确设计 use-cases 之一,也是 Git 在合并期间猜测重命名而不是跟踪文件身份的重要原因——因为当导入 tarred/zipped release 到供应商分支,您没有重命名信息。
请注意,您可以通过明确编号的框架版本来显着帮助此工作流程。这样可以更轻松地跟踪在每个下游项目中导入和合并了哪个版本。