7

如果我们的组织要从 subversion 之类的中央服务器 VCS 切换到 git 之类的分布式 VCS,我如何确保我的所有代码免受硬件故障的影响?

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

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

有没有解决这个问题的通用方法?

一些澄清:

使用本机中央服务器 VCS ,除了开发人员最近的更改之外,所有内容都必须在中央服务器上。因此,例如,如果开发人员决定分支进行错误修复,则该分支位于中央服务器上并且可以立即进行备份。

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

所以我看到的区别(如果我错了,请纠正我!):如果我们使用 DVCS,但使用普通 VCS,半实现的功能和错误修复可能无法用于中央服务器上的备份。我如何保证该代码的安全?

4

7 回答 7

12

我认为您会发现在实践中开发人员更喜欢使用中央存储库,而不是在彼此的本地存储库之间推拉。克隆中央存储库后,在处理任何跟踪分支时,获取和推送都是微不足道的命令。将六个遥控器添加到所有同事的本地存储库是一件痛苦的事情,而且这些存储库可能并不总是可以访问(关闭、在带回家的笔记本电脑上等)。

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

设置中央存储库后,您可以使用 cvs/svn 样式的工作流程来签入和更新。如果您有本地更改,则 cvs update 变为 git fetch 和 rebase,如果没有,则变为 git pull。cvs commit 变成 git commit 和 git push。

通过此设置,您的完全集中式 VCS 系统处于类似的位置。一旦开发人员提交了他们的更改(git push),他们需要这样做才能对团队的其他成员可见,他们就在中央服务器上并将被备份。

在这两种情况下需要纪律的是防止开发人员将长期运行的更改保留在中央存储库之外。我们中的大多数人可能都曾在这样一种情况下工作过,其中一名开发人员正在开发功能“x”,这需要对某些核心代码进行根本性的改变。这一变化将导致其他所有人都需要完全重建,但该功能还没有为主流做好准备,所以他只是保持检查直到一个合适的时间点。

尽管存在一些实际差异,但两种情况的情况都非常相似。使用 git,因为您可以执行本地提交并可以管理本地历史记录,所以个人开发人员可能不会像使用 cvs 之类的东西那样感觉到需要推送到中央存储库。

另一方面,使用本地提交可以作为一个优势。将所有本地提交推送到中央存储库上的安全位置应该不是很困难。本地分支可以存储在开发人员特定的标签命名空间中。

例如,对于 Joe Bloggs,可以在他的本地存储库中创建一个别名来执行类似以下的操作以响应 (eg) git mybackup

git push origin +refs/heads/*:refs/jbloggs/*

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

这有助于应对各种灾难。Joe 的机器坏了,他可以使用另一台机器并获取已保存的提交并从他离开的地方继续。乔病了?Fred 可以取出 Joe 的分支来获取他昨天所做的“必须”修复,但没有机会与 master 进行测试。

回到原来的问题。dVCS 和集中式 VCS 之间是否需要有所区别?您说在 dVCS 案例中,半实现的功能和错误修复不会出现在中央存储库中,但我认为没有区别。

在使用集中式 VCS 时,我已经看到许多情况下,一个半实现的功能仍停留在一个开发人员的工作台上。它要么采用允许将一半编写的功能签入主流的策略,要么必须做出创建中央分支的决定。

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

于 2008-09-21T09:21:16.097 回答
4

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

如果有多个开发人员在一个项目上工作,那么必须记住从其他人那里获取更改是非常乏味的。如果您没有中央存储库,您会怎么做?

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

于 2008-09-21T05:32:32.400 回答
1

在 DVCS 中使用“中央”服务器作为权威并不少见,这也为您提供了进行备份的地方。

于 2008-09-21T05:29:47.807 回答
1

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

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

我们有一个自动备份系统,可以从我们指定的机器上抓取任何目录,因此我将机器上的任何存储库和工作副本添加到最后,包括 git 和 CVS 存储库。

顺便说一句,如果您在发布产品的公司中使用分布式版本控制,那么您拥有一个中央存储库。这是你释放的那个。它可能不在特殊的服务器上;它可能在某些开发人员的硬盘上。但是您从中发布的存储库是中央存储库。(我想如果你还没有发布,你可能还没有。)我感觉所有项目都有一个或多个中央存储库。(实际上,如果他们有多个项目,那就是两个项目,一个是分叉。)这也适用于开源。

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

于 2009-03-30T15:35:06.013 回答
0

您可以让开发人员主目录通过本地网络挂载远程设备。然后你只需要担心网络存储的安全。或者,也许您可​​以使用DropBox 之类的工具无缝地将本地存储库复制到其他地方。

于 2008-09-21T05:32:17.923 回答
0

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

我自己的 git_remote_branch工具对于这种工作流程可能会派上用场(请注意,它需要 Ruby)。它有助于操作远程分支。

作为旁注,谈到回购安全,您可以在您的服务器上设置一个提交后挂钩,该挂钩执行简单的 git clone 或 git push 到另一台机器......每次提交后您都会获得最新的备份!

于 2008-09-21T11:35:34.167 回答
0

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

因为它是在 post-* 钩子中完成的,所以开发人员不需要记住手动进行。而且因为我们使用带超时的 rsync,如果服务器宕机或者用户在远程工作,他们仍然可以工作。

于 2008-09-24T04:12:05.160 回答