如何对“点文件”进行版本控制?

如何对“点文件”进行版本控制?

Etckeeper是一款出色的工具,可用于跟踪配置文件的更改/etc。它有几个关键特点非常突出。它可以与各种 VCS 一起使用:git、mercurial、darcs 或 bzr。它还会每天自动提交,以及在您安装、删除或升级软件包时自动提交。它还会跟踪文件权限和用户/组所有权元数据。

我还想将我的“点文件”保存在主目录中,并进行版本控制,最好是 Bazaar。有谁知道是否存在类似 etckeeper 的工具可以实现这一目的?

最糟糕的情况是,我想象一个简单的 cron 作业bzr add && bzr ci每天运行一次或两次,同时添加~/Documents~/Music等等,.bzrignore 有人已经用脚本做过类似的事情吗?

尽管我更喜欢集市,但其他选择可能也会很有趣。

答案1

我不知道是否有任何东西可以做到这一点,因此我编写了一些代码,以使用此处的存储库准确实现您想要的功能:http://github.com/robertmassaioli/config-files

我有一个文件,上面写着所有文件的位置,generate_links 程序会把它们全部放在那里。如果你知道自己在做什么,并且可以编译一些 Haskell 代码,那么这真的非常简单和容易。不过请注意,它确实是为我个人使用而制作的。

答案2

好吧,我继续手动操作,直到找到更好的解决方案。所以我最好解释一下我做了什么。

首先我做了一个bzr init ~,但接下来我做的是bzr ignore "*"。我决定我不想将整个东西都放在版本控制下。这不值得,尤其是当你考虑到里面有些东西你真的不应该保留在 vcs 中,比如你的密钥。所以我必须添加bzr add我想要的特定文件。您还可以将例外添加到.bzrignore。Python 正则表达式在其中也很有用。我现在把它保持得相当精简。如果一切顺利,我可能会添加所有的~/.config~/.gconf

我还编写了一个简短脚本,将其作为 cron 任务运行。它会检查文件是否已更改,如果已更改,则自动提交:

#! /bin/bash

set -e

TIME=$(date)
STATUS=$(bzr status)

if [ -n "$STATUS" ]; then
    if [ -n "$1" ]; then
         bzr ci ~ -m "$1"
    else
        bzr ci ~ -m "Automatic commit on $TIME"
    fi
fi

exit

答案3

我将整个~目录都变成了 Bazaar 存储库。对于主目录中的文件来说,存储元数据不是问题:所有内容都归同一帐户和组所有,并且bzr已经存储了执行位。

我手动将“有趣”的文件添加到其中(例如,我不希望我的音乐收藏或 Firefox 缓存受到版本控制),但如果您想使用脚本自动执行此操作,我认为在bzr add && bzr ci选定的目录或命令输出上执行的简单解决方案find就可以完成这项工作。

答案4

我使用了一种非自动的解决方案,比如 etckeeper(我必须手动提交),但对我来说效果很好。它没有我想象的那么完善,但确实有效。

我编写了自己的实用程序,类似于GNU 斯托,因为 stow 没有满足我的要求。我称之为存放在家中。运行时,它会查找名为“HOME”的目录。然后,它会获取该目录下的所有内容并将其符号链接到 $HOME 中的相应位置,并根据需要创建目录。它还会转换文件名 - 如果文件以“_”开头,它将被替换为“.”。我这样做是因为当我的点文件未隐藏时(默认情况下在目录列表中看到它们),这样编辑它们会更方便。然后,它会将它们放入应用程序所需的名称中。

因此,我为我的配置创建了多个 git 存储库。我只在其中放置我个人编辑的点文件。这样做的好处是,我可以拥有一个用于与他人共享的点文件存储库(例如我的 Emacs 配置),以及一个用于其他私有文件的存储库(例如,我的 ssh 配置,带有主机名等用于工作)。使用 stow-in-home 进行符号链接可以将所有内容放在正确的位置,但每个文件的源代码控制可以分开。

对我来说,它效果很好。我真的没有理由不能设置一些东西来自动提交。或者将所有点文件移动到适当的存储库中,然后仍然在 home 中使用 stow。但这就是我做事的方式。

相关内容