我应该避免使用git来跟踪具有单独历史logging的单个文件,例如/ var / named?

2012年1月, Randal Schwartz发表了一篇名为“Git Introduction”的演讲,我非常喜欢这个演讲,但是我对他的告诫感到困惑,因为他没有使用git来跟踪不相关或不同的历史logging。

他的幻灯片第4页包含以下几点要点。 。 。

但不是…

  • 跟踪文件权限和所有权
  • 使用单独的历史跟踪单个文件
  • 让事情变得痛苦

。 。 。 这就是他说的,大约4分钟:

它没有针对任何types的关于文件的元数据进行优化。 它不, 它不 ,跟踪文件权限或文件所有权。 这不是它的工作。 它是pipe理源文件,而源代码没有所有者,源代码没有权限。 在食谱中使用来源来构build您要部署的真实事物。 所以git没有这方面的技术。 人们试图在它上面build立结构来做到这一点,并取得了一定程度的成功,但是让我们来看看基本上git是什么意思,而不是人们正在build设什么。

这也不意味着跟踪具有不相关或单独历史logging的单个文件。 例如,你可能会想,“哦,我真的很喜欢这个,我想跟踪我所有的东西,但是等等确实是一堆单独的,不相关的文件,你不会做分支和合并。把这个改变添加到这个改变中,最终同时想退出这两个文件,但这并不是真正的工作方式,所以对单个文件来说是不好的。

我仍然使用RCS来跟踪我/ etc中的单个文件。 这真的很快,很便宜,我可以回到我需要的数据。 这也没有使事情痛苦的优化。 好? 它的devise很容易和东西。

就个人而言,我没有计划跟踪/ etc与git,但我最近开始使用git来跟踪/ var / named(BIND configs)。 鉴于Randal上面要说的,我应该停止使用git来达到这个目的吗? 有没有一个缺点,我不期望的问题,一个困难? 到目前为止,一切正如我所期望的那样工作,而且我没有任何问题,但是由于上面的警告,我实际上犹豫开始使用git来跟踪/ var / named。

我受到Cobbler的scm_track_enabled特性的影响,这个特性说:“在执行添加,编辑或同步事件时,启用哪个版本控制对/ var / lib / cobbler的所有更改的触发器,这可以用来恢复到之前的数据库版本,生成RSS提要,或者用于其他审计或备份目的,git是推荐用于此function的SCM。 我使用/ var / named的git与此非常相似。

(作为一个方面说明,我从来没有使用过RCS ,也不能想象到很难学习,即使这很容易,当我已经对git有一个很好的理解的时候)。

具体来说,我想知道如何使用git来跟踪/ var / named,但我欢迎有关使用git来跟踪目录的最佳实践的答案。

这是陷入“相当主观”的领域。 但…

我发现使用git来跟踪这类事情没有任何错误。 是的,它是为跟踪大量复杂的相关源文件集合而build立的。 这并不意味着它不仅仅适用于跟踪非相关文件的小集合。

就我个人而言,我使用etckeeper来跟踪我的服务器上的/etc ,使用git后端。 很好用。 当从Ubuntu的apt repo安装时,它带有很好的钩子到apt,所以它会自动启动与每个新软件包安装一致的提交。 非常方便。

无论如何,试一试,这不会损害任何东西,如果你最终想要在未来转换到另一个版本控制系统,有很多的移植工具可用。

主观领土的确如此。 我不喜欢etckeeper,它所做的是创build/ etc的非常混乱的历史。 现在为/ var / named(我认为这是你的区域定义的地方)可能会更好,特别是如果你只有几个区域,但它仍然是一个丑陋的黑客。

我发现这样做的“正确”方式是使用Puppet或类似的其他configurationpipe理软件。 您不必configuration您的服务器,而是编写configuration您的服务器的Puppet代码。 我使用mercurial(但你可以使用git)来pipe理Puppet代码库。 分支和合并是非常有用的(例如,你正在开发一个新的configuration,你不确定是否已经被testing了,然后你必须在生产服务器上紧急地修复一个问题;在这种情况下,你从稳定版本分支,合并)。 Puppet + DVCS的组合非常有用,非常干净,但Puppet是一个需要一点时间才能驯服的小野兽,而绑定对于Puppet来说是非常棘手的,因为区域序列号是正确的。

更新:

我一直在考虑这个问题,而且我倾向于认为使用git跟踪/ var / named并没有错,而且这不是一个丑陋的黑客攻击。 是的,这些文件是相关的。 是的,您可能需要克隆,以便对configuration和分支进行严格的修改,以便在修改时保持生产configuration,并在完成修订时进行合并(尽pipe所有这些可能都不常见)。

有点偏离主题,但有关绑定的configuration有两件事我不喜欢。 首先,为了添加一个区域,我需要添加/修改两个文件:named.conf和区域文件。 这是不必要的复杂。 我更喜欢类似于apache的设置,在/ etc / bind / zones-available中使用区域文件,从/ etc / bind / zones-enabled启用symlink,无需触摸named.conf。 其次,序列号是一个麻烦。 我们主要是自动维护。 在Puppetpipe理的机器中,我有一个shell脚本来修复它们,而在另外一些中我使用了一个vim插件。 我们把它们自动化的事实意味着它们可能不在。 文件时间戳可以用来代替。 序列号会在资料库历史logging中产生一些丑陋,但是这是一个绑定问题,而不是git问题,或者是使用git来跟踪绑定configuration的问题。

问你自己…

如果覆盖了/ etc的所有内容,我是否会“回复”到git中的特定提交?

如果覆盖了/ etc的所有内容,我是否会将提交“合并”到当前状态?

我猜测答案是NO,NO,NO。

如果是这样,git是错误的工具。 Git正在跟踪文件树,而不是单个文件。 这就是为什么我为RCS争取单个文件的原因。