我们已经将很多源代码迁移到git上,并对我们当前的解决scheme感到非常满意。 我们希望我们的服务器configuration文件在同一个系统上进行版本pipe理,但是有一些事情并不按照我们希望的方式工作,我希望有人可以在这里分享他的经验。
这个问题类似于使用服务器configuration文件的版本控制? ,但是我们有一些特殊的要求,不适用于这个问题的build议。
当前的设置使用颠覆configuration文件。 相应的存储库看起来像这样
/#存储库的根目录 + - www.domain.com/#www的configuration | \ - 等等/ | \ - 的Apache2 / dev - dev.domain.com/#configuration | + - 等/ | \ - select/ | \ - APP1 / | \ - dev上的app1的conf /#configuration - staging.domain.com/#configuration用于分段
有了颠覆,这将工作得很好,因为它可能只是签出存储库的子目录。 另外,你可以使用svn:externals指向一个通用结构来完成几个不同的configuration设置。 我们只需处理所有版本化目录中的.svn文件。 Git另一方面没有svn:外部和稀疏签出始终需要从根目录到实际目录的path相同。
在讨论迁移到git时,我试着写下服务器configuration版本的主要要求 :
是否有一个很好的方法来在一个存储库中拥有所有的configuration,只有一个子path作为工作副本? 目前我正在考虑两种方法,但是首先想在这里提出这个问题
在一台机器上使用git进行configuration文件pipe理工作正常,但我相信一定有人按照我们想要的方式使用它。
谢谢
Kariem
我以前用过这样的东西; 这是如何工作的。
/etc/resolv.conf
。 这些将是你现在在“svn:externals”仓库中保存的文件。 git pull
回购。 更改单个机器分支中的代码很简单, 只需在你的开发环境中git checkout
出合适的分支,进行更改,然后将它们提交回中央仓库。 该分支中的所有机器将在下一次运行cron作业时自动获取更改。
更改模块分支的代码只是稍微有点棘手,因为它涉及两个步骤:
git checkout
相应的模块分支 git checkout
使用该模块分支的每个机器分支,然后将模块分支合并到其中。 git会发现你已经合并了这个模块分支,并且只注意到自上一个共同父代以来发生的变化。 这种方法既有好处也有弊端。 一个好处是,我可以对模块分支进行更改,并将其应用到需要它的机器分支,从而使机器分支不会与旧版本保持一致,直到准备就绪。 那么缺点是你必须记得把你的模块分支合并到每个可能使用它的机器分支中。 我使用遍历提交树的脚本,并自动为我合并,但仍然是一个痛苦。
作为替代,新版本的git支持“ 子模块 ”:
子模块允许将外部存储库embedded到源树的专用子目录中,始终指向特定的提交。
这样可以让你创build一些像“svn:externals”树一样的东西,然后你可以像现在一样更新它。
这里的一个结点,但它听起来像一个职位接收钩可以完成这项工作
Repo master存储在/ var / master中
该钩子克隆到/ var / localclone
然后复制主机的具体细节
您需要在每台服务器上本地设置.git / post-receive挂钩(使用适当的设置)
这听起来像是你想要一个更像木偶或厨师的东西,而不是git这个,这将允许你运行git来集中pipe理configuration和模块,并让puppet \ chefpipe理你的部署和validation
这是我想到的一个快速工作
1.在/var/repo
有一个中央存储库
2.将全局的文件放入该目录中的所有域。
3.为每个子域/var/repo/subdomain1
, /var/repo/subdomain2
等创build分支
4.创build一个邮件钩子,任何推送到分支与主人合并。
所以,当你改变/var/repo/subdomain2
configuration时,它会立即与主合并,所以你可以完全拉回购,并拥有所有的configuration文件
当你想拉个人的子域configuration,只要拉适当的分支。
你如何把你的configuration文件到/var/repo/*
是完全不同的事情(cron选项卡,我能想到)
〜$