如何使“点文件”处于版本控制之下?


30

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

我也想将我的“点文件”也保存在主目录的版本控制下,最好是集市。有人知道为此目的是否存在诸如etckeeper之类的工具?

最坏的情况下,我想,一个简单的cron作业运行bzr add && bzr ci一次或一起加入每天两次~/Documents~/Music等来的.bzrignore 已经做了脚本类似的东西,有人吗?

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


4
Unix Stack Exchange上的相关讨论:将〜置于源代码控制之下的技巧。它不能回答您的问题,但是仍然可以提供有用的信息。
吉尔斯(Gillles)“所以-别再邪恶了”,2010年

1
现在有很多用于此目的的工具。见dotfiles.github.io下的部分“通用dotfile实用程序”。
罗宾·格林

@RobinGreen如果您将其转化为一个正确的答案,我可以接受。bzr当然不是2015
要走

Answers:


7

我不知道是否有这样做的东西,因此我在这里使用了我的存储库,整理了一些代码来实现您想要的功能:http : //github.com/robertmassaioli/config-files

我有一个文件,说明所有文件所属的位置,generate_links程序将它们全部放在那里。如果您知道自己在做什么,并且可以编译一些Haskell代码,那么它真的很简单。尽管被警告说它确实是为我个人使用而制作的。


3
为Haskell +1!-1代表haskel!大声笑。不,但是真的。
德里克(Derek)2010年

我听到你了 我之所以选择Haskell是因为我正在学习它,它可能是也可能不是最适合这份工作的语言。:)
罗伯特·马赛奥利

3

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

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

当我第一次发布此内容时,我已经选择了自己的答案,但决定撤消该操作。这肯定不是2015
。– andrewsomething

2

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

我手动向其中添加了“有趣的”文件(例如,我不希望我的音乐收藏或firefox缓存受版本控制),但是如果您要使用脚本自动执行此操作,我认为这是一种简单的解决方案这样做bzr add && bzr ci对选定的目录或一个输出find命令将刚刚做的工作。


2

我将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

例如。

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


1

我使用的不是etckeeper之类的自动解决方案(我必须手动提交),但对我来说效果很好。它不像我喜欢的那样开发,但是可以工作。

我写了自己的类似于GNU Stow的实用程序,因为stow并没有完成我想要的全部工作。我称它为“ 收藏在家”。运行后,它将查找名为“ HOME”的目录。然后,它将获取该目录下的所有内容,并将其符号链接到$ HOME中的相应位置,并根据需要创建目录。它还将转换文件名-如果文件以“ _”开头,则将替换为“。”。我这样做是因为在不隐藏点文件的情况下更好地编辑它们(默认情况下,请在目录列表中查看它们)。然后,将它们放入应用程序期望的名称中。

因此,我有几个用于配置的git存储库。我只将自己编辑的点文件放在其中。这样做的好处是,我可以拥有一个可以与他人共享的点文件的存储库(例如,我的Emacs配置),以及一个可以供其他私有文件的存储库(例如,我的s​​sh配置,带有主机名等)。带有内部存放位置的符号链接放置将所有内容放置在正确的位置,但是每个放置位置的源代码控制可以分开。

对我来说效果很好。确实没有理由我无法设置某些东西来自动执行提交。或将所有点文件移至适当的存储库中,仍在家中使用存储。但这就是我所做的事情。



0

通过将我希望保留在源代码管理下的所有dotfiles复制到/ home /目录中名为“ dotfiles”的文件夹中,可以完成此操作。当然,这意味着保留副本并在必要时来回复制,但是我发现这对我自己是最简单的解决方案。


1
不必管理重复项,难道您不只是创建指向dotfile的符号链接吗?
瑞安

我想你当然可以!
德里克(Derek)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.