- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果我们的组织要从像 subversion 这样的中央服务器 VCS 切换到像 git 这样的分布式 VCS,我如何确保我的所有代码都不会出现硬件故障?
有了中央服务器 VCS,我只需要每天备份存储库。如果我们使用 DVCS,那么所有开发人员机器上都会有大量代码分支,如果硬件出现故障(或者开发人员丢失了他的笔记本电脑或被偷了),那么我们将没有任何备份.
请注意,我不认为“让开发人员将分支推送到服务器”是一个好的选择 -- 那是 tedious开发人员最终不会这样做。
是否有解决此问题的通用方法?
一些说明:
使用本地中央服务器 VCS,一切 都必须在中央服务器上,除了开发人员最近的更改。因此,例如,如果开发人员决定分支来修复错误,则该分支位于中央服务器上并可立即进行备份。
如果我们使用的是 DVCS,那么开发人员可以创建一个本地分支(实际上还有很多本地分支)。在开发人员认为“哦,是的,我应该将其推送到中央服务器”之前,这些分支都不在中央服务器上并且可用于备份。
所以我看到的差异(如果我错了请纠正我!):如果我们使用 DVCS,则半实现的功能和错误修复可能无法在中央服务器上进行备份,但使用正常的风控系统。我如何保证该代码的安全?
最佳答案
我认为您会发现,在实践中,开发人员更愿意使用中央存储库,而不是在彼此的本地存储库之间进行推送和 pull 。一旦你克隆了一个中央存储库,在处理任何跟踪分支时,获取和推送都是微不足道的命令。将六个 Remote 添加到所有同事的本地存储库是一件痛苦的事情,而且这些存储库可能并不总是可以访问(关闭、在带回家的笔记本电脑上等)。
在某些时候,如果你们都在同一个项目上工作,那么所有的工作都需要整合。这意味着您需要一个集成分支,将所有更改集中在一起。这自然需要放在所有开发人员都可以访问的地方,例如,它不属于首席开发人员的笔记本电脑。
设置中央存储库后,您可以使用 cvs/svn 样式的工作流来 checkin 和更新。如果您有本地更改,则 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 的机器出问题了,他可以使用另一台机器获取已保存的提交并从他离开的地方继续。乔病了? Fred 可以获取 Joe 的分支以获取他昨天所做但没有机会针对 master 进行测试的“必须有”修复。
回到最初的问题。 dVCS 和集中式 VCS 之间是否需要区别?你说在 dVCS 案例中,半实现的功能和错误修复不会最终出现在中央存储库中,但我认为这没有区别。
我见过很多情况,在使用集中式 VCS 时,一个开发人员的工作箱中保留了一个半实现的功能。它要么采用允许将一半编写的功能 checkin 主流的策略,要么必须做出创建中央分支的决定。
在 dVCS 中可能会发生同样的事情,但应该做出同样的决定。如果有重要但未完成的工作,需要集中保存。 git 的优势在于创建这个中央分支几乎是微不足道的。
关于git - 如何确保我的 git repo 代码是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/110313/
采用这个 repo 结构: Server (main repo) ProjectA (subrepo) SharedLibrary (subrepo) Client (main rep
我们正在尝试使用 https://grails.org/plugin/jms用于 jms 集成。但我们无法解决它。 环顾四周,我能够验证它是否存在于这个 repo 中: http://repo.gra
是否可以在现有的 Mercurial 存储库中创建 Mercurial 存储库? 这个想法是将存储库的子目录作为不同的存储库进行处理,你是如何做到的? 我不是在谈论子存储库(至少,如果我理解子存储库的
这个问题在这里已经有了答案: How do I work with a git repository within another repository? (5 个答案) 关闭 6 年前。 我想克隆
我在尝试让 ssh 在 GIT 中工作时犯了一个灾难性的错误。 我实际上将错误的 url 从服务器复制到该存储库的配置文件中。因此,我放入配置文件的 url 是一个不同但名称相似的 repo。 现在,
我们在 github 上有数百个不再使用的存档库。 默认情况下,Github 上没有 stash 存档仓库的选项。目前,通过 active repos 是不友好的,尤其是在 github 上大量滚动。
在 .repo文件: [centos] name=centos7.2 baseurl=http://10.0.0.1/centos7.2/7.2/xxx/x86_64/ enabled=
一位同事使用 repo start 创建了功能分支 thebranch。现在我想检查这个分支并对其进行处理。我试试这个: repo init -u git@gitserver:manifest.git
我在github上托管了一个项目,结构如下 github.com/example/allpackages . ├── .git └── packages ├── example-1 ├
我在github上托管了一个项目,结构如下 github.com/example/allpackages . ├── .git └── packages ├── example-1 ├
我们可以使用 hg in -vp 将我们的本地仓库与主仓库进行比较。 如何在视觉上做到这一点?我们使用 ExamDiff extension作为我们的 Mercurial 视觉差异工具。我们认为有一种
我有一个 repo 镜像服务器 (myrepo),最初创建它是为了镜像和与远程同步(repoA)。也就是说,我使用了类似下面的东西来创建它。 cd myrepo repo init -u git://
我镜像了https://github.com/boostorg/boost.git使用命令到我自己的存储库: git clone --recursive https://github.com/boos
来自 Viewing Unpushed Git Commits我知道如何区分我自己的 repo 和本地提交: git diff origin/master..HEAD 但是,我怎样才能使用 path/
我已将我的应用程序源 (git repo) 存储在文件夹中: MyProject/front_app 但在 GitHub 上,我希望将存储库命名为 front_app 而不是 my_project_f
我有一个 repo1和 repo2在本地机器上。它们非常相似,但后者是某种其他分支(不再维护 repo1)。 /path/to/repo1 $ git log HEAD~5..HEAD~4 Add:
我在 Mac OS X (10.7.3)、x64 Intel 上更新我的 Android 源代码树时遇到问题。代码是根据 Downloading the Source Tree 安装的, 并且 SE
我有两个位于不同服务器上的存储库,分别称为 repo-1 和 repo-2。 开始两个“树干”是平等的: repo-1/trunk == repo-2/trunk 与此同时,正在向 repo-1/tr
我大约在 6 个月前加入,当我到达时,我的团队没有使用任何形式的版本控制。我已经说服 mgmt 在新项目中使用 Mercurial,所以我们在我们的网络服务器上有以下结构: -MainFolder (
我正在尝试从包含通常结构(分支、标签和主干)的 repoA 迁移到仅在主干中具有子文件夹的现有 RepoB,该 RepoB 在分支、标签和主干中具有项目和代码。 我有一个通过代码创建的转储文件: sv
我是一名优秀的程序员,十分优秀!