将master合并到每个主机自定义分支时避免合并冲突

时间:2016-09-26 17:16:06

标签: git dotfiles

我想将所有我的dotfiles存储在git存储库中,并使用单独的分支 为每台机器。我有一个问题我无法解决阻止我 为此目的使用git。我想知道别人怎么样 解决了它。

我将只有一个master分支 模板定义和定义应该是常见的 对于所有分支,例如:

export EMAIL="@EMAIL@"
export SURFRAW_google_results=1000

我将在机器分支上用正确的电子邮件替换@EMAIL@ 并提交它,但SURFRAW_google_results将保持不变。对于 例如,在work分支上我会有:

export EMAIL="user@corp.com"
export SURFRAW_google_results=1000

现在,我决定将SURFRAW_google_results=1000更改为10.这是 应该在全球范围内共享,所以我首先在master上更改它:

export EMAIL="@EMAIL@"
export SURFRAW_google_results=10

然后我将work变为master

$ git checkout work
$ git rebase master

现在我发生了冲突,因为线路在线I之上 变化是不同的:

<<<<<<< a60114eea1c98d2354a07bd4fd0cdd63cba62e93
export EMAIL="@EMAIL@"
export SURFRAW_google_results=10
=======
export EMAIL="user@corp.com"
export SURFRAW_google_results=1000
>>>>>>> m

如果bash我可以很快逃脱 通过采购机制包括机器特定的部分但是怎么样 不支持包含/采购其他配置的配置,例如.fluxbox/keys.screenrc

1 个答案:

答案 0 :(得分:9)

您可以使用as illustrated in this answer来考虑 content filter driver ,而不是直接在分支之间修改并发数据(这会导致冲突.gitattributes declaration)。

smudge (来自“Customizing Git - Git Attributes”的图片,来自“Pro Git book”)

我们的想法是在版本中管理这些dotfiles,但使用模板占位符代替实际值(取决于分支)。
生成的实际dotfiles仍然被忽略(.gitignore) 这意味着你的实际工作树不会变得“脏”。

具有实际值的文件也可以进行版本控制,但名称不同(因此在合并/重新定位时不会发生冲突)

涂抹脚本根据分支名称选择正确的值文件,并根据在git checkout期间应用污迹脚本的点文件模板生成正确的点文件。

为了让每个分支的涂抹效果不同,我建议调用一个脚本,该脚本首先查看当前分支的名称。
请参阅旧答案“Best practice - Git + Build automation - Keeping configs separate”中的示例。

#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)

OP提到,为了在结帐时应用污迹脚本,需要删除索引。这是真的,如I explained here

  

索引是将工作树中的东西移动到对象存储库以及将东西从对象存储区移动到工作树的中间人。

通过删除索引,您可以强制git将其恢复,这意味着应用任何内容过滤器驱动程序(如果存在)。

请参阅“git: re-checkout files after creating smudge filter”。