Mercurial(以及我猜Git)与Dropbox一起使用:有什么缺点吗?

63

我有一个个人项目的Mercurial仓库,几周前开始将主仓库存储在我的Dropbox中(沿用此方式,并且我知道用Git也可以实现)。

这个想法既可以作为在多台机器上工作的方式,又可以作为远程备份。 我克隆了仓库并在非Dropbox副本上工作,只有在有需要时才会推送更新,就像我会使用Bitbucket一样。

与使用专门的托管服务(如Mercurial的BitBucket)相比,您能想到这种想法的任何缺点吗?我知道Bitbucket针对单个用户有免费帐户,这很不错,但它们限制在150M,这并不是很大。

特别是,Dropbox的同步过程是否可能会损坏仓库?我曾经在主仓库上运行过一次,但这可能与此无关(而且它成功地恢复了)。有人对此有不好的经历吗?有人有更长时间的好经验并可以减轻我的担忧吗?是否有任何基于对这些东西内部机制的更好理解而得出的意见?

编辑:我对问题做了一些澄清。它们在斜体字中。


2
为什么你不使用Bitbucket? :/ - Nicolás
在推送到Dropbox之前,请告诉Dropbox暂停同步。然后再进行推送。在恢复同步之前,记下确切的时间,以便在发生问题并想要还原更改时可以在Dropbox网站上找到更改批次。经过几次推送后,执行git gc以保持存储库中文件数量的最小化。 - Endy Tjahjono
5
这里需要注意的是,Bitbucket不再对其私有仓库设置150MB的限制。现在的限制是只有5名开发人员可以访问该仓库。 - runxc1 Bret Ferrier
10个回答

75

出于上述原因,我不建议这样做,而且要更加强烈地表达。Mercurial和Git都有自己的协议来在存储库之间移动变更集。这些协议被优化/构建用于:

  • 效率
  • 一致性(永远不会从未完成更新的存储库中获取)
  • 挂钩/触发器-- 在推送/拉取时执行操作,包括质量(不允许使用制表符等)过滤器

当您只是让目录同步处理保持 .hg(或 .git)目录同步时,那么在该同步期间,您将拥有一个处于不一致状态并且不知道的远程存储。

此外,hg和git都具有本地仅限和远程可行的磁盘状态分离。它们知道什么信息可以共享(例如:已提交的变更集),什么信息不能共享(例如:当前的本地工作目录父修订)。

在其他答案中,人们说“您可能会没问题”或“我从未遇到过问题”,这很可能是真的,但这并不是保证,版本控制不是玩赌博的地方。为您的源代码控制系统使用适当、更好、更安全、更高效、更全面的同步协议。


17

我曾经在使用Dropbox存储代码库时遇到过损坏的问题。虽然这种情况并不总是发生,但发生多次说明我将停止使用Dropbox来进行此类操作。

尽管如此,相比于购买真正的托管服务,Dropbox显然更便宜。只要你保持备份,你可能会发现它对于个人项目是可以接受的。


3
Dropbox似乎在短时间内创建和删除大量文件时会出现混乱,例如锁定文件。 - Aaron Digulla

10

我想对于一个或两台个人项目来说,那可能还可以。但是如果你要处理涉及多个成员的项目,你真正需要使用专业托管服务。

我个人使用过BitBucket相当长一段时间,并且非常满意……在免费账户上也可以有一个私有项目。


4
截至2012年1月13日,您可以在Bitbucket.org上拥有无限数量的私人项目,但整个帐户只能有5个合作者。因此,只要您的团队不超过6人,就可以使用。 - sholsinger

2

如果您尝试在同步过程中访问存储库,我预计会出现问题。这似乎也有点额外的开销。您不需要同步已经同步的内容。我不知道Dropbox如何处理冲突,但我怀疑它不能以SCM感知方式处理冲突。


2
对于bitbucket,点赞。它是免费的,而且你可以在免费帐户中获得一个单独的私人仓库(不像github)。
只使用dropbox的缺点是,如果你在本地仓库中搞砸了什么东西,这个问题会被复制到bitbucket,并且会被复制到你安装了dropbox的其他所有地方。Dropbox非常快,所以你无法及时阻止它发生,从而避免问题。
你失去了将对存储库进行更改与发布这些更改分离的能力。
我确实使用dropbox托管了一些我在家里和工作机器上使用的存储库,但那些不是这些存储库的唯一副本。还有一个bitbucket仓库(以及其他人克隆了它们)。

1
使用Dropbox副本作为“主要”副本,并实际上使用本地克隆进行工作。因此,Dropbox不是唯一的副本。也许我应该将其编辑到问题中。 - daphshez
如果在Dropbox之外有至少一个克隆/副本,它应该可以正常工作。我用一些个人笔记存储库做这件事情,每晚都会在Dropbox之外备份。 - Ted Naleid

2

我之前一直使用Dropbox和Hg,但是直到最近才发现一个问题。Hg在常规检查时没有报告损坏的情况,只有在你真正需要使用存储库时才会发现(这是最糟糕的情况,因为你不知道是否出现了问题)。

目前还不清楚损坏是自发性的,还是由于使用Mac、Windows和Linux客户端访问存储库引起的(我在不同的时间都使用这三种客户端)。但我至少见过一种情况,在仅有Mac处于活动状态时发生了损坏,所以很可能是Dropbox本身的问题。

如果您决定冒险使用,请定期运行“hg verify”(或“git verify”)以查找任何问题。


1

我不建议使用Dropbox与Mercurial,因为我经常在我的Mac和Windows客户端之间看到冲突的文件。特别是撤销功能受到影响,但我也遇到过其他文件的冲突。

敬礼 Mirko


1

我已经使用Dropbox和git进行个人项目的开发相当长一段时间了,到目前为止还没有遇到过任何问题。虽然有时候你需要等待Dropbox同步。如果有多个人在同一个项目上工作,我认为这可能会导致一些小问题,但对于个人项目而言,我发现Dropbox甚至比GitHub更好,因为推送/拉取速度更快。

至于在同步过程中进行推送/拉取,这很可能会导致问题,甚至可能损坏您的repo,但如果只有您一个人在项目上工作,那么您就知道Dropbox何时进行同步。


我假设你只是在推送和拉取到git认为的本地仓库,当使用Dropbox时,没有"远程"的概念,对吗? - johnbakers
这看起来不错。我会尝试看看是否可能以编程方式停止/启动Dropbox,然后将整个过程包装到每日的crontab脚本中。 - Christophe Muller

0

对于那些更喜欢使用Dropbox而不是Bitbucket/Github的人,以下是我避免云备份服务的双向同步过程中出现损坏的方法:

我的本地代码文件夹是c:\code,备份文件夹是c:\Dropbox。在Dropbox文件夹中,我有一个truecrypt加密的文件容器(它的大小足够大,可以容纳我的代码文件夹)。在白天,我经常提交本地Git/Mercurial存储库的更改。然而,在一天结束时,我退出Dropbox并挂载truecrypt文件容器。我将更改推送到文件容器中的裸仓库,卸载它并重新启动Dropbox。

这样,我就可以安全地使用云服务作为我的DVCS存储库的备份。如果文件容器正在使用中,Dropbox将等待其被卸载,因此希望在那里没有损坏的机会。但是,如果我以某种方式得到了文件容器的冲突副本,我可以轻松地挂载两个副本并比较更改集。


0

目前我正在使用Bazaar在3台机器上进行操作。然而,在任何一个分支中,我都是唯一的开发人员。

我使用了init-repo --no-trees命令来创建存储库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接