我有 3 台 Linux 机器,并希望通过某种方式使它们的主目录中的点文件保持同步。有些文件,如 .vimrc,在所有 3 台机器上都是相同的,有些文件对每台机器都是唯一的。
我以前使用过 SVN,但所有关于 DVCS 的嗡嗡声让我觉得我应该尝试一个 - 有没有一个特别适合这个?还是我应该坚持使用 SVN?
我有 3 台 Linux 机器,并希望通过某种方式使它们的主目录中的点文件保持同步。有些文件,如 .vimrc,在所有 3 台机器上都是相同的,有些文件对每台机器都是唯一的。
我以前使用过 SVN,但所有关于 DVCS 的嗡嗡声让我觉得我应该尝试一个 - 有没有一个特别适合这个?还是我应该坚持使用 SVN?
我多年来一直遇到这个问题,我认为版本控制不一定是正确的方法。我在Unison 文件同步器上取得了很好的成功,该文件同步器专为在两台机器上维护一致的主目录而设计。我目前正在统一管理七个副本,细节有点棘手,但它是一个很棒的工具,如果你从两个开始,你会非常高兴。
Unison 和 VCS 之间的主要区别在于,Unison 愿意延迟处理必须合并的冲突。另外,它可以正确设置所有默认值。而且速度很快:我每天都使用它,通过 DSL 线路同步大约 40GB 的数据。
任何 DVCS 都可能正常工作。我最喜欢的是集市。将您的配置文件保存在 .config、版本和符号链接中是最简单的。
DVCS 的一个好处是您也可以对每台机器的配置文件进行版本控制,而不会干扰版本控制全局配置。
我遇到了同样的问题,并在 Subversion 之上构建了一个工具,该工具添加了权限、所有权和第二上下文跟踪,将 .svn 目录保留在实际版本化的树之外,并添加了层的概念,因此您可以跟踪所有您的配置与开发相关,然后您只在用于开发的机器上检查。
这帮助我在我登录的 50 多台机器上更好地组织设置。
这是项目页面。它的边缘仍然有点粗糙,但我们也在工作中使用它来为我们的 60 多台服务器版本系统配置。
通常,任何使用某种元数据文件来跟踪内容的版本控制系统都会在实际使用时给您带来痛苦。
版本控制软件对于主目录来说并不是很好。更糟糕的是,某些软件并不真正喜欢 .svn 文件夹或开始解释其内容。您当然可以尝试通过一些非常复杂的镜像设置来解决这个问题,但这很难。
这是一个尝试这样做的 Mozilla 开发人员:版本控制我的主目录,评论中有一些建议。
git或Mercurials的廉价分支非常适合这种情况。我从 Mercurial 开始,因为它更简单,但后来转向了 git。
一种非常灵活地处理这个问题的方法是在版本控制下建立一个构建目录,而不是尝试和 svn 你的实际主目录(它有自己的问题)
所以在这个里面你保持一个结构
/home/you/code/dotfiles /home/you/code/dotfiles/dotbashrc /home/you/code/dotfiles/dotemacs ... /home/you/code/dotfiles/makefile
并且makefile可以包含专门化文件的逻辑(或不包含)
可能比您需要的要重,但是如果您的实际设置很复杂(我一次在 3 或 4 个不同的单元上完成了此操作),那么值得做这样的事情。
我为此使用 git。到目前为止,我已经能够使多台机器上的主目录保持同步,而无需分支和合并。相反,我使用git rebase
. 到目前为止,冲突很少,而且很容易解决。
我通过将需要具有单独内容的文件放入.gitignore
.
我在 git 中保留以下工具的配置文件:
我将笔记等保存在一个拥有自己的 git 存储库的子目录中。
如果您还没有,我建议您查看etckeeper 。它旨在使用版本控制系统对 /etc 中的配置文件进行版本控制:
etckeeper 是一组工具,可让 /etc 存储在 git、mercurial、darcs 或 bzr 存储库中。它与 apt(以及其他包管理器,包括 yum 和 pacman-g2)挂钩,以在包升级期间自动提交对 /etc 所做的更改。它跟踪修订控制系统通常不支持的文件元数据,但这对 /etc 很重要,例如 /etc/shadow 的权限。它非常模块化和可配置,如果您了解使用修订控制的基础知识,它也很容易使用。
尽管它是为 /etc 设计的,但我认为它可能也适用于主目录(可能进行一些调整),因为基本需求是相同的。
我知道这是一个旧线程,但在搜索一些点文件时发现了它。
我当前的系统正在使用颠覆。我所做的关键是将工作副本检出到 ~/.svnhome/ 中(事后看来应该将其称为 .dotfiles 或更通用的名称)。然后,我创建指向我在该计算机上实际使用的文件的符号链接到家中。例如,我的 .procmail 和 .spamassassin 文件夹只需要在邮件服务器上,所以我不会在我的家庭服务器上链接它们。
唯一有一些差异的文件是 .bashrc 文件在我的 mac 上为 macports 有一些额外的行。所以在 .bashrc 的底部,我让它检查 .bashrc_local 是否存在并解析它。
这是我使用颠覆的最后一件事情(除了工作之外,其他一切都在使用 git)。svn 的好处是因为它不是 dvcs,所以我不必担心在一台服务器上意外提交而忘记推送它。
我考虑过将其移至 git,以便创建分支。使用上面的示例,我将为我的主服务器创建一个分支,我将添加 .procmail 和 .spamassassin 文件夹,但在 master 分支中没有这些文件夹。但是当前的系统已经运行了好几年——甚至在 git 出现之前——并且现在没有任何特别的动机来改变它。