git 个分支共享一组通用文件

git branches sharing a common set of files

我正在使用 git 一个软件项目进行版本控制,该项目包含一个很大的公共部分以及一些根据特定目标机器更改的文件:

+project-folder
|-cnc_sources
|  |-...(lot of common files)
|  |-specialized.cnc
|-plc_sources
|  |-...(lot of common files)
|  |-specialized.plclib
|-config
|  |-specialized.param

由于我支持三种不同类型的机器,我目前的解决方案是一个包含三个不同分支的单一存储库,每台机器一个,除了少数专用文件外共享一个很大的公共部分。

我在本地克隆每个 machine/branch 的 repo(这对于测试和部署软件非常方便),但是这个解决方案的扩展性不是很好,因为我必须手动保持公共部分的同步所有分支复制所有其他工作文件夹中文件的最新版本并在那里提交。

我想知道这种手动工作是否可以避免。我也觉得不对劲:公共文件在分支之间有不同的历史和变更集,有时我觉得很混乱。

供应商 IDE 需要源代码树中特定位置的文件,因此我无法将公共部分收集到单独的文件夹中(例如创建子存储库)。

我需要有 N 个分支共享一组分散在源代码树中的公共文件(无法收集它们),但由于我是 git 新手我不知道我的用例的最佳实践,所以我想知道有经验的用户在我的情况下会做什么。

我认为你做得不对。如果我是你,我会有一个 main 分支(或 common,也许),你可以在其中共享项目文件....在项目的根目录或名为 common 或类似的东西。如果它是共享的东西,还有 config 目录。这是您继续处理公共资源的分支。

然后,从这个分支开始为每台机器进行定制开发......所以,比如说...... cnc 分支是从 common 分支开始的。您在那里添加 specialized.cnc 并提交。你回到common,专用文件不见了。您从这里开始 plc 分支。在此处添加 specialized.plclib。添加并提交。现在,如果你切换到 cnc,你会得到 cnc 的文件,你回到 plp,你会得到 plc 的文件。生活是美好的......现在你可以在单独的分支上工作并挑选......当你在公共分支上工作时,你可以合并到特定于机器的分支中。

工作流程

现在,如果您认为自己 不能 common 上工作,因为该项目需要其他分支的细节才能 build/test,那么就变成了workflow的问题。

假设您在 cnc 上并更改了几个常用文件和 cnc-proper 文件中的一个更改。你如何移动这些变化?嗯,一个简单的方法是这样的:

git add the-specific-file-for-cnc
git commit -m "cnc: blah blah"
# at this point all the changes you have pending are for common files
# then you should be able to checkout common and commit there
git checkout common
git add the-common-files
git commit -m "common: blahblah"

好的,所以你在不同的分支中提交了。如何将在 common 中所做的更改返回到 cnc 中,这是您需要它们的地方?足够简单:

git checkout cnc
git merge common -m "cnc: merging changes from common"

plc

也是一样
git checkout plc
git merge common -m "plc: merging changes from common"

这绝不是处理它的唯一方法,但至少应该让您了解可以使用哪些技巧。