如何在版本控制下保留“点文件”?

Etckeeper是一个很好的工具,用于跟踪/etc配置文件的更改。 关于它的一些关键事项确实很突出。 它可以与各种VCS一起使用:git,mercurial,darcs或bzr。 它还会每天自动提交,无论何时安装,删除或升级包。 它还跟踪文件权限和用户/组所有权元数据。

我还希望在版本控制下将我的“点文件”保存在我的主目录中,最好是bazaar。 有谁知道像etckeeper这样的工具是否存在?

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

虽然我更喜欢集市,但其他选择可能会很有趣。

我不知道是否有任何东西可以做到这一点所以我掀起了一些代码来实现你想要的使用我的存储库: http : //github.com/robertmassaioli/config-files

我有一个文件,说明所有文件都属于哪里,generate_links程序只是将它们全部放在那里。 如果您知道自己在做什么并且可以编译一些Haskell代码,那么它非常简单易行。 虽然被警告说它确实是为了我自己的个人用途。

好吧,我继续手动完成,直到找到更好的解决方案。 所以我不妨解释一下我做了什么。

首先我做了一个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 

我将整个~目录转换为Bazaar存储库。 存储元数据不是主目录中文件的问题:所有内容都归同一个帐户和组所有,而bzr已经存储了执行位。

我手动添加“有趣”的文件(我不想,例如,我的音乐collections或firefox缓存是在版本控制下),但如果你想用脚本自动化这个,我认为这是简单的解决方案在选定的目录或find命令的输出上执行bzr add && bzr ci只会完成这项工作。

我将zsh和vim文件保存在git中,放在github上,放在不同的存储库中:

例如,对于zsh,我创建了“.zsh”并将zshrc和zshenv放入其中,加上一个脚本将zshrc链接到〜/ .zshrc,将zshenv链接到〜/ .zshenv,就像这样。

 while true do read -p "do you want to link zshenv to ~/.zshenv (Y/N)" yn case $yn in [Yy]*) ln -s ~/.zsh/zshenv ~/.zshenv; break;; [Nn]*) break;; *) echo "please answer yes or no";; esac done while true do read -p "do you want to link zshrc to ~/.zshrc (Y/N)" yn case $yn in [Yy]*) ln -s ~/.zsh/zshrc ~/.zshrc; break;; [Nn]*) break;; *) echo "please answer yes or no";; esac done 

所以我这样做

 git clone git://git@github.com:tshirtman/.zsh cd .zsh ./init.sh 

对于.vim,它几乎是一样的,除了我使用子模块插件,带病原体,所以我在init.sh中添加了

 git submodule init git submodule update 

当我想添加一个vim插件时,我这样做

 git submodule add git://github.com/nathanaelkane/vim-indent-guides.git bundle/vim-indent-guides 

例如。

好吧,如果您想要管理多个点目录,则需要做太多工作,但没有什么能阻止您将它们全部放在同一个目录中,或者通过活动分开(对于所有图形编辑器,一个用于网络活动……)左右。 无论如何,这就是我做的,所以只是我的两分钱:)。

我使用的解决方案不像etckeeper那样自动(我必须手动提交),但它对我来说效果很好。 它并不像我喜欢的那样发达,但它确实有效。

我已经编写了自己的实用程序,类似于GNU Stow ,因为stow没有完成我想要的所有操作。 我称之为Stow in Home 。 运行时,它会查找名为“HOME”的目录。 然后它接受该目录下的所有内容并将其符号链接到$ HOME中的相应位置,根据需要创建目录。 它还将翻译文件名 – 如果文件以’_’开头,则将替换为’。’。 我这样做是因为在没有隐藏它们时编辑我的点文件更好(默认情况下在目录列表中查看它们)。 然后,它会将它们放在应用程序所期望的名称中。

所以,我的配置有几个git存储库。 我只把我亲自编辑的点文件放在其中。 这样做的好处是我可以拥有一个可以与其他人共享的点文件存储库(比如我的Emacs配置)和一个私有的(例如,我的s​​sh配置,主机名等工作)。 符号链接放入家中将所有东西放在正确的位置,但每个的源控制可以是分开的。

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

你不能将dot files添加到Etckeeper中使用的存储库吗?

我已经通过将我喜欢的所有dotfiles复制到我的/ home /目录中的一个名为“dotfiles”的文件夹来完成它。 当然这意味着在必要时保持重复和来回复制,但我发现这对我自己来说是最简单的解决方案。

我将我的文件保存在子目录中并制作符号链接。 我有一个自动执行此操作的脚本。 您可以访问http://code.google.com/p/samking-config-files/source/browse/查看所有内容。