mercurial存储库的数据损坏

时间:2013-07-01 08:20:11

标签: mercurial backup dropbox google-drive-api hardlink

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

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

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

如果我code中的仓库被破坏,codeBackup仓库会自动损坏,因为克隆操作使用了原始仓库的硬链接?因此,我的双云备份策略将毫无用处?

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


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

  

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

     

如果提交,Mercurial旨在打破.hg内部的这种硬链接   或推送到其中一个克隆。前提是,   Windows API mercurial正在使用的应该给出正确的答案,   如果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:显示所有带有硬链接的文件&gt; 1

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

2 个答案:

答案 0 :(得分:6)

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

不要那样做!

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

  1. 您的机器永远不会失去互联网连接
  2. 您一次不会在多台计算机上进行不同步的新更改(包括您遇到网络问题的时间)
  3. Dropbox将始终运行(永不丢失互联网连接的变体)
  4. 你不仅仅是关于时机的不幸,
  5. 要验证Dropbox是否容易导致存储库损坏,请执行以下操作:

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

      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帐户,并使用它来推送和拉动以在多台计算机之间进行同步。

答案 1 :(得分:1)

code存储库损坏的唯一方法(假设它最初克隆到codeBackup时没有损坏)是当你某些东西时,无论是什么东西被写入硬链接文件,Mercurial首先打破硬链接,创建文件的独立副本,然后只修改新创建的副本。

所以回答你的问题:在正常使用情况下,存储库损坏将传播到你的codeBackup存储库。