27

Scenario: I'm trying to get my unix dot-files under git. I have to work between (at least) the cygwin environment and some standard linux distros (ubuntu and opensuse), and I have files/lines of code that are only specific to, say, cygwin. Since I don't want to checkout useless files or have to deal with lots of cases inside my dotfiles, I'm creating branches for each of my environments. But most of the edits I do are common to all environments, so almost every time I made a commit I need to propagate that change to all my branches.

So basically I have several branches that are almost identical except for a few commits, and most commits I do need to be in all branches.

The question: what is the recommended git workflow for this, if there is any? Or is there a better setup (without using multiple branches?) for my scenario?

[I tried cherry-picking, but that involves quite a bit of work, and not to mention all the duplicate commits out here and the nightmare it is to keep my branches in sync.]

4

3 回答 3

19

对于这种特殊情况,在一个分支中有很多通用文件在发展,而每个环境只有几个特定的​​配置文件……我们不会将配置文件存储在 Git 中。完全没有。

我们确实存储了所述配置文件的模板,以及所有特定的每个环境值,以及能够用正确的值替换模板文件中的变量的脚本(检测当前平台)

这样,我们不需要只为这些文件创建一个分支。


管理此类文件(具有特定于平台的内容)的另一种好方法是通过git 属性过滤器驱动程序(另请参阅Pro Git book)。

过滤器驱动程序由clean命令和smudge命令组成,其中任何一个都可以不指定。
根据checkout,当smudge指定命令时,命令从其标准输入提供 blob 对象,其标准输出用于更新工作树文件。
同样,该clean命令用于在签入时转换工作树文件的内容。

这样,smudge 引用的脚本(由 Git 管理)可以用特定于平台的值替换所有变量,而 clean 脚本会将其内容恢复到未触及的配置文件中。

http://git-scm.com/figures/18333fig0702-tn.png

主要思想仍然是:避免只为这种并行进化创建分支。

于 2010-01-28T07:44:49.280 回答
9

一种方法是为每个环境保留一个分支,加上一个所有环境通用的“主”分支。每当您对主分支进行更改并希望将其拉入另一个系统时,请执行以下操作:

git pull
git checkout local
git rebase master

这将根据“master”的当前状态重写“local”(针对此特定环境)的当前更改。

您需要注意的手动操作是在哪里提交您想要进行的更改。如果它是系统本地的,则将其提交到该系统的“本地”分支,否则将其提交到“主”并将其推送到公共存储库。

当然,变基可能会导致您必须手动解决的冲突。此外,如果您选择将本地分支推送到公共存储库,则必须 (a) 为每个环境选择唯一名称,并且 (b) 在变基后处理非快进推送。这两个问题都是可以解决的。

于 2010-01-28T07:34:06.097 回答
1

好问题。即使你说:

...因为我不想签出无用的文件...

我会将特定于平台或特定于变体的项目放在与主代码相同的分支中,但放在该平台/变体的单独目录中。关键是将特定于平台的东西隔离到尽可能小的区域(即避免ifdef主代码中的 s)。

例如:

/
+--common
+--linux
+--cygwin
+--windows
+--mac

各种跨平台项目以这种方式组织起来。例如,查看支持多平台的 Python 源代码结构。

它在这方面简化了您的工作流程,因此您可以更自由地将分支用于其他更有趣的目的。

于 2010-01-29T04:47:55.693 回答