mercurial存储库的数据损坏

use*_*ser 1 backup mercurial hardlink dropbox google-drive-api

我有一个mercurial存储库c:\Dropbox\code.我使用以下方法在本地创建了此repo的克隆:

hg clone -U c:\Dropbox\code c:\GoogleDrive\codeBackup
Run Code Online (Sandbox Code Playgroud)

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

如果我的repo code变得腐败,codeBackuprepo会自动损坏,因为克隆操作使用硬链接到原始repo?因此,我的双云备份策略将毫无用处?

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


更新:在挖掘之后,我将添加这些作为参考

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

Mercurial旨在打破.hg中的这些硬链接,如果对其中一个克隆进行提交或推送.前提条件是,如果mercurial询问"此文件中有多少个硬链接?",Windows API mercurial正在使用应该给出正确的答案.

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

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

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

  • 要检查硬链接:

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

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

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

ang*_*son 6

关于存储库损坏,这里最大的问题是您使用Dropbox和Google Drive在计算机之间同步存储库.

不要那样做!

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

  1. 您的机器永远不会失去互联网连接
  2. 您永远不会在多台计算机上同步未更新新的更改(包括您遇到Internet问题的时间)
  3. Dropbox将始终运行(从不丢失互联网连接的变体)
  4. 你不仅仅是关于时机的不幸

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

  1. 导航到Dropbox或Google云端硬盘文件夹中的文件夹,然后在此处创建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云端硬盘将显示哪些内容)
  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!
Run Code Online (Sandbox Code Playgroud)

而是获得一个免费的bitbucketkiln帐户,并使用它来推送和拉动以跨多台计算机同步.