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

use*_*840 8 git dotfiles

我想将所有的dotfiles git存储在存储库中,每个机器都有单独的分支.我有一个问题我无法解决阻止我使用git它的目的.我想知道其他人是如何解决它的.

我将有一个单独的master分支,其中只包含模板定义和定义,这些定义和定义应该对所有分支都是通用的,例如:

export EMAIL="@EMAIL@"
export SURFRAW_google_results=1000
Run Code Online (Sandbox Code Playgroud)

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

export EMAIL="user@corp.com"
export SURFRAW_google_results=1000
Run Code Online (Sandbox Code Playgroud)

现在,我决定改为SURFRAW_google_results=100010.它应该在全球范围内共享,所以我首先要改变它master:

export EMAIL="@EMAIL@"
export SURFRAW_google_results=10
Run Code Online (Sandbox Code Playgroud)

然后在我的基础workmaster:

$ git checkout work
$ git rebase master
Run Code Online (Sandbox Code Playgroud)

现在我遇到了冲突,因为我改变的线上方的线是不同的:

<<<<<<< a60114eea1c98d2354a07bd4fd0cdd63cba62e93
export EMAIL="@EMAIL@"
export SURFRAW_google_results=10
=======
export EMAIL="user@corp.com"
export SURFRAW_google_results=1000
>>>>>>> m
Run Code Online (Sandbox Code Playgroud)

如果bash我可以迅速通过采购机制包括机器特定的部分,但不支持包括/采购其他配置,如.fluxbox/keys.screenrc

Von*_*onC 9

您可以使用.gitattributes声明来考虑内容过滤器驱动程序,而不是直接在分支之间修改并发数据(这会导致冲突,如本答案中所示).

弄脏 (图片来自" 自定义Git - Git属性 ",来自" Pro Git book ")

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

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

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

为了使每个分支的涂抹效果不同,我建议调用一个脚本,该脚本首先查看当前分支的名称.
请参阅我的旧答案中的示例" 最佳实践 - Git +构建自动化 - 保持配置分离 ".

#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)

OP提到,对于涂抹脚本应用在结账时,除需要的指数.这是真的,正如我在这里解释的那样:

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

通过删除索引,您强制git将其还原,这意味着应用任何内容筛选器驱动程序(如果存在).

请参阅" git:创建涂抹过滤器后重新签出文件 ".


归档时间:

查看次数:

373 次

最近记录:

9 年,1 月 前