场景:我正在尝试在git下获取我的unix点文件。我必须在(至少)cygwin环境和一些标准的Linux发行版(ubuntu和opensuse)之间工作,并且我有特定于cygwin的文件/代码行。由于我不想检查无用的文件或者不得不处理我的dotfiles中的大量案例,我正在为我的每个环境创建分支。但是我所做的大部分编辑都适用于所有环境,因此几乎每次我提交时都需要将更改传播到我的所有分支。
所以基本上我有几个几乎相同的分支,除了一些提交,大多数提交我需要在所有分支。
问题:这有什么推荐的git工作流程,如果有的话?或者,对于我的场景,是否有更好的设置(不使用多个分支?)?
[我尝试过采摘樱桃,但这涉及到相当多的工作,更不用说这里所有重复的提交以及保持我的分支同步的噩梦。]
答案 0 :(得分:16)
对于那种特殊情况,在一个分支中存在大量常见文件,并且每个环境只有少数配置文件...我们不会将配置文件存储在Git中。完全没有。
我们存储所述配置文件的模板,以及所有特定的每个环境值,以及能够用正确的值替换模板文件中的变量的脚本(检测当前平台)
这样,我们不需要为这些文件创建分支。
管理这类文件(使用平台特定内容)的另一个好方法是通过 git attribute filter driver (另请参阅Pro Git book)。
过滤器驱动程序由
clean
命令和smudge
命令组成,其中任何一个都可以不指定。
在checkout
时,当指定smudge
命令时,命令从其标准输入中提供blob对象,其标准输出用于更新工作树文件。
同样,clean
命令用于在签入时转换worktree文件的内容。
这样,smudge引用的脚本(使用Git管理)可以用特定于平台的值替换所有变量,而clean脚本会将其内容恢复为未触及的配置文件。
主要思想仍然是:避免仅为那种并行演化创建分支。
答案 1 :(得分:7)
一种方法是为每个环境保留一个分支,以及一个对所有环境都通用的“主”分支。每当您对主分支进行更改并希望将其拉入另一个系统时,请执行以下操作:
git pull
git checkout local
git rebase master
这将针对“master”的当前状态重写“local”(针对此特定环境)的当前更改。
您需要注意的手动事项是您要进行更改的地方。如果它是系统本地的,则将其提交给该系统的“本地”分支,否则将其提交给“master”并将其推送到公共存储库。
当然,变基可能会导致您必须手动解决的冲突。此外,如果您选择将本地分支推送到公共存储库,则必须(a)为每个环境选择唯一的名称,以及(b)在重新定位后处理非快进推送。这两个问题都是可以解决的。
答案 2 :(得分:1)
好问题。即使你说:
...因为我不想检查无用的文件......
我会将特定于平台或特定于变体的项目放在与主代码相同的分支中,但是在该平台/变体的单独目录中。关键是将平台特定的东西隔离到尽可能小的区域(即避免主代码中的ifdef
)。
E.g:
/
+--common
+--linux
+--cygwin
+--windows
+--mac
各种跨平台项目以这种方式组织起来。例如。查看Python的源代码结构以支持多个平台。
它简化了您在这方面的工作流程,因此您可以更自由地将分支机构用于其他更有趣的目的。