我使用 Gentoo Linux,它的配置相当复杂。我的问题是使用 git 来控制我的配置文件的版本是否明智?
我家里有一些 git 仓库,我猜如果我将 /home/** 放到我的 .gitignore 中,它们就不会引起问题。
澄清更新:
使用 git 对“/”根目录中的系统级配置文件进行版本控制是一种明智的方法吗?
答案1
对你的问题的简短回答是是的。
我会毫不犹豫地推荐使用 Git(或任何其他版本控制软件)来跟踪配置文件。自从这样做以来,我的工作效率更高(特别是在配置新安装时),并且对我的配置文件更有信心。通过版本控制,我可以记录什么进行了更改,提交消息提供了原因为什么更改已完成。如果更改产生了意想不到的副作用,我可以轻松查看日志/历史记录以查看哪些更改导致了这些影响。
就我个人而言,我会谨慎地跟踪/
根目录下的所有文件。要忽略的路径列表可能会变得很大且难以处理。我更喜欢将每组逻辑文件保存在自己的存储库中。
我手动使用 Git 来跟踪我的个人的配置/启动文件,例如 Vim 配置、Bash 函数、别名等 - 类似于如何使用 git 跟踪 $HOME。我将每组文件保存在它们自己的存储库中,并使用指向主目录的符号链接。
为了系统配置文件,我使用 GitEtckeeper跟踪我的/etc
目录中的文件。
缺点
需要注意的一个问题是,被跟踪的文件是否包括硬链接. 当使用 Git 签出文件或以其他方式修改工作树时,它取消文件链接然后重新创建它们。 看Git、点文件和硬链接以获得更详细的解释。
Etckeeper
Etckeeper 可用于保存对 /etc 所做更改的完整历史记录。它跟踪修订控制系统通常不支持但对 很重要的文件元数据/etc
,例如 的权限/etc/shadow
。
它与 apt 和 yum 等包管理器挂钩(在其默认配置下),在安装前和安装后运行,以便/etc
跟踪所有更改。
如果安装或删除了软件包,/etc 中所有未提交的更改都将在软件包操作之前提交,因此会有两次提交:
- “在 yum run 之前保存 /etc 中未提交的更改”
- “在 yum run 之后提交 /etc 中的更改”
我曾将它用于 Debian 和基于 Red Hat 的发行版,我知道它支持 Arch 包管理。我无法说出它能为 Gentoo 系统增加多少自动化,但有可用的包。
它还支持将配置文件推送到远程存储库 (当然,应该是私密的)。
配置
安装软件包后,您可能需要对其进行配置(/etc/etckeeper/etckeeper.conf
),例如,在 Ubuntu 系统上,默认版本控制系统从 Git 更改为 Bazaar。您可能还想禁用每日自动提交。
每日自动提交
可以通过每日 cron 任务自动提交更改。这可能会很烦人,因为存储库可能会因多个自动提交消息而变得混乱。
我取消注释相应的行/etc/etckeeper/etckeeper.conf
:
sed -i '/AVOID_DAILY_AUTOCOMMITS/s|^#* *||' /etc/etckeeper/etckeeper.conf
忽略某些文件
编辑/etc/.gitignore
以指定任何不应被跟踪的文件。
第一次运行
配置完成后,运行以下命令:
sudo etckeeper init
sudo etckeeper commit "Initial commit"
如果你的当前目录是etc
,你可以运行常规git
命令,例如,
sudo git status
sudo git log
答案2
我使用 git 来跟踪我的主目录的特定区域。就我个人而言,我不会走上跟踪根目录的道路,但我必须说我钦佩你的雄心壮志。:)
也许这一系列的经历可以让你更好地了解你可能会遇到的情况:
对于“回答”表示抱歉,而不是直接在评论中给出链接;但是,代表性不够,但希望参与其中。
编辑
哇!@AnthonyGeoghegan 的回答非常好。我相信这并不像我最初想象的那么困难。
答案3
我也用git
它来储存和维护我的dotfiles
,但在git bare repository
。可以找到详细指南这里。我使用两个存储库,一个名为用于我的用户点文件myconf
,一个名为用于 root 的点文件rootconf
。
此外,您可以在多台机器、不同的 Linux 发行版或虚拟机上使用这两种配置:只需为不同的配置创建一个新分支即可。然后,您就避免在同一个文件中混淆代码(例如.bash_alias
):不再需要烦人的 if 来检查当前机器;也不需要链接!
答案4
我还认为 Git 是管理配置文件的不错选择。我使用一个存储库来存储我的个人点文件,其中$HOME
包含指向存储库工作副本的符号链接。可以使用 Git 分支来管理主机之间的差异。我对一组机器使用公共分支(例如linux
),对具体主机使用子分支(例如arch
)。但是,保持符号链接和分支的更新现在是一项额外的任务。因此,我编写了一个小工具(配置更新) 它会在必要时 (重新) 创建符号链接,并自动将分支合并到依赖子分支中。也许它对任何人都有用。