如果我们的组织要从像subversion这样的中央服务器VCS切换到像git这样的分布式VCS,我该如何确保我的所有代码都免受硬件故障的影响?
使用中央服务器VCS,我只需要每天备份存储库.如果我们使用的是DVCS,那么所有开发者机器上都会有大量的代码分支,如果硬件失败(或者开发人员丢失了他的笔记本电脑或者它被盗),那么我们就没有任何备份.
请注意,我不认为这是"让开发人员将分支机构推送到服务器"的一个好选择 - 这很乏味,开发人员最终也不会这样做.
这个问题有一个共同的方法吗?
一些澄清:
使用本机中央服务器VCS,除了开发人员的最新更改之外,所有内容都必须位于中央服务器上.因此,例如,如果开发人员决定进行分支以执行错误修正,则该分支位于中央服务器上并立即可用于备份.
如果我们使用DVCS,那么开发人员可以进行本地分支(实际上是许多本地分支).在开发人员认为"哦,是的,我应该将其推送到中央服务器"之前,这些分支都不在中央服务器上并且可用于备份.
所以我看到的差异(如果我错了,请纠正我!):如果我们使用的是DVCS,但是使用正常的VCS,半实现的功能和错误修正可能无法用于中央服务器上的备份.如何保证代码安全?
我认为你会发现在实践中,开发人员更愿意使用中央存储库,而不是在彼此的本地存储库之间推送和拉动.一旦克隆了中央存储库,在处理任何跟踪分支时,获取和推送都是微不足道的命令.将六个遥控器添加到所有同事的本地存储库是一件痛苦的事情,这些存储库可能并不总是可以访问(关闭,在笔记本电脑上带回家等).
在某些时候,如果你们都在同一个项目上工作,那么所有工作都需要整合.这意味着您需要一个集成分支,其中所有更改都汇集在一起.这自然需要在所有开发人员都可以访问的地方,例如,它不属于主要开发人员的笔记本电脑.
一旦设置了中央存储库,就可以使用cvs/svn样式工作流来签入和更新.如果你有本地更改,cvs update会变成git fetch和rebase,如果你没有,就会变成git pull.cvs commit变成了git commit和git push.
通过此设置,您可以与完全集中的VCS系统保持相似的位置.一旦开发人员提交了他们需要做的更改(git push)以便团队的其他成员可见,他们就会在中央服务器上进行备份.
在这两种情况下需要遵守纪律的是阻止开发人员将长时间运行的更改保留在中央存储 我们大多数人可能在一个开发人员正在研究特征'x'的情况下工作,这需要对某些核心代码进行根本性的改变.此更改将导致其他所有人需要完全重建,但该功能还没有为主流做好准备,所以他只是保持检查,直到合适的时间点.
尽管存在一些实际差异,但在这两种情况下情况非常相似.使用git,因为你可以执行本地提交并且可以管理本地历史记录,所以单个开发人员可能不会像cvs那样感觉到推送到中央存储库的需要.
另一方面,可以使用本地提交作为优点.将所有本地提交推送到中央存储库的安全位置应该不是很困难.本地分支可以存储在特定于开发人员的标记名称空间中
例如,对于Joe Bloggs,可以在其本地存储库中创建别名,以响应(例如)执行类似以下的操作git mybackup
.
git push origin +refs/heads/*:refs/jbloggs/*
这是一个可以在任何时候(例如一天结束时)使用的单个命令,以确保安全备份所有本地更改.
这有助于各种灾难.Joe的机器爆炸,他可以使用另一台机器,并且获取保存的提交并从他离开的地方继续.乔病了吗?弗雷德可以取得乔的分支来抓住他昨天所做的"必须"修复,但没有机会对主人进行测试.
回到最初的问题.是否需要在dVCS和集中式VCS之间存在差异?你说半实现的功能和错误修正不会最终出现在dVCS案例的中央存储库中,但我认为不需要有任何区别.
我已经看到很多情况,当使用集中式VCS时,一个半实现的功能停留在一个开发人员工作盒上.它要么采取允许将半写功能签入主流的策略,要么必须做出决定来创建中心分支.
在dVCS中可能会发生同样的事情,但应该做出同样的决定.如果有重要但不完整的工作,则需要集中保存.git的优点是创建这个中心分支几乎是微不足道的.