2008-09-21 50 views
7

如果我们的组织要从一个像Subversion这样的中央服务器VCS切换到像git这样的分布式VCS,我该如何确保我的所有代码都可以避免硬件故障?如何确保我的git回购代码安全?

对于中央服务器VCS,我只需要每天备份存储库。如果我们使用的是DVCS,那么在所有开发人员机器上都会有大量代码分支,并且如果该硬件出现故障(或者开发人员会丢失笔记本电脑或者它被盗),那么我们就不会有任何备份。

请注意,我不认为这是一个很好的选择,“让开发人员推送分支机构到服务器” - 这是tedious和开发人员最终不会这样做。

是否有解决此问题的常用方法?

一些澄清:

随着本地中央服务器的VCS然后一切必须是除了开发商的最新变化在中央服务器上。因此,例如,如果开发人员决定分支执行错误修复,则该分支位于中央服务器上,并可立即进行备份。

如果我们使用DVCS,那么开发人员可以做一个本地分支(实际上还有许多本地分支)。这些分支机构都不在中央服务器上,只有在开发人员认为“哦,是的,我应该将其推送到中央服务器”时才可用于备份。

所以我看到的差异(纠正我,如果我错了!):半实施的功能和错误修正可能不适用于中央服务器上的备份,如果我们使用DVCS,但与一个正常的VCS。我如何保持代码安全?

回答

12

我认为你会发现在实践中开发人员更喜欢使用中央存储库,而不是在彼此的本地存储库之间进行推拉。一旦你克隆了一个中央仓库,在处理任何跟踪分支时,获取和推送都是简单的命令。向所有同事的本地存储库添加六七个远程控制台是一件痛苦的事情,这些存储库可能并不总是可以访问的(关掉电脑,在家里拿一台笔记本电脑等)。

在某些时候,如果你们都在同一个项目上工作,所有的工作都需要整合。这意味着您需要一个集成分支,将所有更改集中在一起。这自然需要在所有开发人员都可以访问的地方,例如,它不属于主要开发人员的笔记本电脑。

一旦建立了中央存储库,您就可以使用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/* 

这是一个可以在任何时候(如一天结束)一起使用,以确保他的所有本地更改都安全地备份一个命令。

这有助于各种灾难。乔的机器爆炸了,他可以使用另一台机器取回已保存的提交并继续从他离开的地方继续。乔生病了?弗雷德可以让乔的分支去抓住他昨天做出的'必须有的'修正,但是没有机会对主人进行测试。

回到原来的问题。 dVCS和集中式VCS之间是否需要有所区别?你说半实现的功能和错误修正不会在dVCS案例中的中央存储库上结束,但我会争辩说不需要任何区别。

我已经看到很多情况下,使用集中式VCS时,半实施功能停留在一个开发人员工作箱上。它要么采取允许将一半书面特征检入主流的策略,要么决定创建一个中央分支。

在dVCS中可能发生同样的事情,但应该做出同样的决定。如果有重要但不完整的工作,则需要集中保存。 git的优势在于创建这个中心分支几乎是微不足道的。

1

使用“中央”服务器作为DVCS中的权限并不少见,它也为您提供备份的位置。

0

您可以让开发人员主目录通过本地网络安装远程设备。那么你只需要担心网络存储安全。或者,也许你可以使用像DropBox这样的东西无缝地复制你的本地回购。

+0

主目录通过本地网络挂载远程设备
我们之前已经尝试过,而且由于网络延迟,通常会造成灾难性后果。那对于备份磁带来说意味着更多的东西。 – 2008-09-21 06:16:38

3

我认为这是一个谬论,使用分布式VCS必然意味着您必须必须以完全分布式的方式使用它。建立一个通用的git仓库并告诉每个人仓库是官方仓库是完全有效的。对于正常的开发工作流程,开发人员可以从公共存储库中获取更改并更新其自己的存储库。只有在两个开发人员积极协作才能实现特定功能的情况下,他们可能需要直接从对方获取更改。

由于有不少开发人员在从事项目工作,因此必须记住要从其他人那里获取更改。如果没有有中央存储库,你会怎么做?

在工作中,我们有一个备份解决方案,每天备份每个人的工作目录,并将整批文写入DVD每周。因此,尽管我们有一个中央存储库,但每个存储库也都备份。

+0

格雷格 - 我已经澄清了这个问题,强调我正在谈论半实现功能/ bug分支。 VCS或DVCS无论如何都需要成为发布等的中央服务器。 – 2008-09-21 06:44:03

0

您团队中的所有开发人员也可以在服务器上拥有自己的分支机构(可以是门票或只是每个开发人员等)。这样他们不会破坏master分支中的构建,但他们仍然可以将他们的工作推进到备份的服务器中。

My own git_remote_branch工具可能适用于那种工作流程(请注意,它需要Ruby)。它有助于操纵远程分支机构。

作为一个便笺,谈论回购安全性,在您的服务器上,您可以设置一个post-commit钩子来执行简单的git克隆或git推送到另一台计算机......您可以在每个备份之后获得最新的备份承诺!

0

我们使用rsync将各个开发者.git目录备份到服务器上的目录中。这是使用围绕git clone的包装脚本以及post-commit等钩子来设置的。

因为它是在post-hook中完成的,所以开发人员不需要记住手动完成它。而且由于我们使用超时的rsync,如果服务器关闭或用户正在远程工作,它们仍可以工作。

1

我觉得这个问题有点奇怪。假设您使用的是非分布式版本控制系统(如CVS),那么您将在中央服务器上拥有一个存储库,并在开发人员的服务器上进行工作。你如何备份存储库?你如何备份开发者正在进行的工作?这些问题的答案正是你必须做的处理你的问题。

使用分布式版本控制,开发人员的服务器上的存储库只是在进行中。你想支持它吗?然后支持它!就这么简单。

我们有一个自动备份系统,可以抓取我们指定的机器上的任何目录,因此我在机器上添加了任何存储库和工作副本,包括git和CVS存储库。顺便说一下,如果你在公司发布产品时使用分布式版本控制,那么你有一个中央存储库。这是你释放的人。它可能不在特殊的服务器上;它可能在某些开发人员的硬盘上。但是您发布的存储库是中央存储库。 (我想如果你还没有发布,但是你可能还没有发布。)我觉得所有的项目都有一个或者多个中央仓库。 (如果他们有不止一个,这是两个项目,一个是分叉。)这也适用于开源。

即使您没有中央存储库,解决方案也是一样的:备份开发人员的机器上的工作。无论如何,你应该一直这样做。正在进行的工作在分布式存储库而不是CVS工作副本或直接非版本化目录中的事实并不重要。

+0

我们不支持开发人员工作站(当你有100人时,它很昂贵),并鼓励他们每天检查几次。然后我们只需要备份服务器。这不是git的选项。 – 2009-03-30 23:17:58