首页 > 解决方案 > git 分支共享一组通用文件

问题描述

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

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

因为我支持三种不同类型的机器,所以我目前的解决方案是一个包含三个不同分支的单一仓库,每台机器一个,共享一个很大的公共部分,除了几个专门的文件。

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

我想知道这项手工工作是否可以避免。我也觉得有些地方不对劲:公共文件在分支之间有不同的历史记录和变更集,有时我会感到困惑。

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

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

标签: gitversion-controlbranch

解决方案


我认为您没有正确执行此操作。如果我是你,我会有一个main分支(或者common,也许),你有共享的项目文件....或者在项目的根目录下,或者在一个名为common或类似的目录中。config如果它是共享的东西,也是dir 。这是您继续处理公共资源的分支。

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

工作流程

现在,如果您认为您无法继续工作,common因为该项目需要其他分支的细节才能构建/测试,那么它就变成了工作流的问题。

假设您正在打开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"

这绝不是处理它的唯一方法,但至少这应该让您了解您可能实施的各种技巧。


推荐阅读