1

我在c:\Dropbox\code. 我已经使用以下方法在本地创建了这个 repo 的克隆:

hg clone -U c:\Dropbox\code c:\GoogleDrive\codeBackup

这个裸仓库仅用于备份目的。我定期将更改推送到 codeBackup。此外,两个目录都备份在云中(分别为 Dropbox 和 Google Drive)。

如果我的仓库损坏了,由于克隆操作使用了指向原始仓库的硬链接,仓库codecodeBackup自动损坏吗?这样我的双云备份策略就没有用了吗?

PS:我知道后备选项是使用云服务来恢复以前已知的良好状态。


更新:挖掘后,我将添加这些以供参考

问题是,如果完成了“hg clone”(没有 --pull 选项),那么目标和源 repo 使用硬链接1共享 .hg/store 内的文件,如果文件系统提供硬链接功能(NTFS 提供) .

如果对其中一个克隆进行提交或推送,Mercurial 旨在破坏 .hg 中的此类硬链接。这样做的先决条件是,如果 mercurial 询问“此文件上有多少硬链接?”,则使用的 Windows API mercurial 应该给出正确的答案。

我们发现这个答案几乎总是错误的(总是报告 1,即使它实际上是 >1)如果 hg 进程在一台 Windows 计算机上运行并且存储库文件在另一台 Windows 计算机上的网络共享上。

  • 为避免硬链接(使用 --pull):

    hg clone -U --pull c:\Dropbox\code c:\GoogleDrive\codeBackup

  • 检查硬链接:

    fsutil hardlink list <file>: 显示所有硬链接<file>

    find . -links +1: 显示所有硬链接 > 1 的文件

    ls -l:显示每个文件旁边的硬链接计数

4

2 回答 2

6

关于存储库损坏,这里最大的问题是您使用 Dropbox 和 Google Drive 来跨机器同步存储库。

不要那样做!

这肯定会导致存储库损坏,除非您可以保证:

  1. 您的机器永远不会失去互联网连接
  2. 您将永远不会一次在多台机器上进行未同步的新更改(包括您遇到互联网问题的时间)
  3. Dropbox 将始终运行(永不丢失互联网连接的变体)
  4. 你不只是在时机方面很不走运

要验证 Dropbox 是否容易导致存储库损坏,请执行以下操作:

  1. 导航到 Dropbox 或 Google Drive 文件夹中的文件夹,并在此处创建 Mercurial 存储库。在一台机器上执行此操作,我们称这台机器为 A。
  2. 向其中添加 3 个文本文件,其中包含一些内容(非空),然后提交这 3 个文本文件。
  3. 等待 Dropbox/Google Drive 将所有这些文件同步到您的第二台计算机上,我们称这台机器为 B
  4. 要么断开其中一台机器上的互联网连接,要么停止其上的 Dropbox/Google Drive(不管是哪台机器)
  5. 在机器 A 上,通过添加或修改其中的内容来更改文件 1 和 2。在机器 B 上,更改文件 2 和 3,确保添加/修改与您在机器 A 上所做的内容不同的内容。在两台机器上提交所有更改。
  6. 重新连接到互联网或重新启动 Dropbox/Google Drive,具体取决于您在第 4 步中所做的操作
  7. 等待同步完成(Dropbox 将在其托盘图标中显示一个绿色复选标记,不确定 Google Drive 将显示什么)
  8. hg verify在机器 A 和 B 上的存储库中运行

请注意,它们现在都已损坏:

D:\Dropbox\Temp\repotest>hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
 3.txt@?: rev 1 points to unexpected changeset 1
 (expected 0)
 3.txt@?: 89ab3388d4d1 not in manifests
3 files, 2 changesets, 6 total revisions
1 warnings encountered!
2 integrity errors encountered!

取而代之的是获得一个免费的bitbucketkiln帐户,并使用它在多台计算机之间进行推送和拉取同步。

于 2013-07-01T22:37:37.833 回答
1

存储库损坏的唯一方法code(假设您最初将其克隆到时它没有损坏codeBackup)是当您向它写入内容时,无论是提交、重写历史记录等。每当将某些内容写入硬链接文件时, Mercurial 首先断开硬链接,创建文件的独立副本,然后只修改新创建的副本。

因此,回答您的问题:在正常使用场景下,存储库损坏不会传播到您的codeBackup存储库。

于 2013-07-01T09:44:16.910 回答