关于在源代码控制中维护点文件的技巧

当您将环境保存在源代码控制中时,开发 VM 和容器将成为解决方案,而不是问题。
34 位读者喜欢这篇文章。

有没有遇到过开始使用新电脑的情况,无论是自己选择还是因为旧电脑冒烟了,然后对让一切都恰到好处需要花费多长时间感到沮丧?更糟糕的是,有没有花时间重新配置您的 shell 提示符,然后意识到您更喜欢之前的设置?

对我来说,当我决定要在 容器 中进行开发时,这个问题变得尖锐起来。容器是短暂的。开发工具很容易解决:带有工具的容器镜像即可。源代码也很容易解决:源代码控制维护它,并且开发发生在分支上。但是,如果每次我创建一个容器时,都需要仔细配置它——那将会很痛苦。

家庭修订控制

将配置文件保存在版本控制中一直是一个有吸引力的选择。但是幼稚地这样做是令人担忧的。直接对 ~ 进行版本控制是不可能的。

首先,太多程序认为将秘密保存在那里是安全的。它也是 ~/Downloads 和 ~/Pictures 等文件夹的位置,这些文件夹可能不应该进行版本控制。

在主目录中仔细维护 .gitignore 文件以管理包含排除列表是危险的。在某些时候,其中一个路径会出错。数小时的配置丢失,大文件最终进入 Git 历史记录,或者,最糟糕的是,秘密和密码被泄露。当此策略失败时,它会灾难性地失败。

手动维护大量的符号链接也不起作用。版本控制的全部原因是为了避免手动维护配置。

编写安装脚本

这暗示了关于在源代码控制中维护点文件的第一个线索。编写安装脚本。

像所有好的安装脚本一样,使其幂等:运行两次不应添加两次配置。

像所有好的安装脚本一样,使其仅执行最少的操作:使用任何其他技巧来指向源代码控制中的配置文件。

~/.config 目录

现代 Linux 程序在直接在主目录中查找配置之前,会在 ~/.config 中查找其配置。最重要的示例是 git,它在 ~/.config/git 中查找。

这意味着安装脚本可以将 ~/.config 符号链接到主目录中源代码控制管理的目录中

#!/bin/bash
set -e
DOTFILES="$(dirname $(realpath $0))"
[ -L ~/.config ] || ln -s $DOTFILES/config ~/.config

此脚本查找其位置,然后将 ~/.config 符号链接到签出到的位置。这意味着关于它需要位于主目录中的位置的假设很少。

源文件

大多数 shell 仍然直接在主目录中查找文件。为了解决这个问题,您添加了一层间接层。从 $DOTFILES 源文件意味着在修改 shell 配置时无需重新运行安装程序

$!/bin/bash
set -e
DOTFILES="$(dirname $(realpath $0))"
grep -q 'SETTING UP BASH' ~/.bashrc || \
  echo "source $DOTFILES/starship.bash # SETTING UP BASH" >> ~/.bashrc

同样,请注意脚本很小心地保持幂等性:如果该行已存在,则不会再次添加它。它还考虑了您已对 .bashrc 进行的任何编辑。虽然这不是一个好主意,但没有必要惩罚它。

测试并再次测试

当您将环境保存在源代码控制中时,开发 VM 和容器将成为解决方案,而不是问题。尝试一个实验:启动一个新的开发环境,克隆您的点文件,安装,看看会发生什么故障。

不要只做一次。每周至少做一次。这使您更快地完成它,并且还可以告知您哪些不起作用——打开问题,修复它们,然后重复。

接下来阅读什么
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,在 Linux “安装聚会”中提供帮助。自 1999 年以来,他一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 自这些术语出现之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重现性以及其他此类事情。

1 条评论

我认为您是对的。管理配置文件是一项繁琐的工作,但不知何故我尝试对 [1] 它们进行源代码控制,并使用 rsync 将它们复制回来。

[1] https://gitlab.com/psachin/configs

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.