Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mercurial存储库的数据损坏_Mercurial_Backup_Dropbox_Google Drive Api_Hardlink - Fatal编程技术网

mercurial存储库的数据损坏

mercurial存储库的数据损坏,mercurial,backup,dropbox,google-drive-api,hardlink,Mercurial,Backup,Dropbox,Google Drive Api,Hardlink,我在c:\Dropbox\code有一个mercurial存储库。我已使用以下方法在本地创建了此回购协议的克隆: hg clone -U c:\Dropbox\code c:\GoogleDrive\codeBackup 此裸回购仅用于备份目的。我定期将更改推送到codeBackup。此外,这两个目录都在云中备份(分别是Dropbox和Google Drive) 如果code中的我的回购损坏,code备份repo是否会自动损坏,因为克隆操作使用了指向原始回购的硬链接?因此,我的双云备份策略将毫

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

hg clone -U c:\Dropbox\code c:\GoogleDrive\codeBackup
此裸回购仅用于备份目的。我定期将更改推送到codeBackup。此外,这两个目录都在云中备份(分别是Dropbox和Google Drive)

如果
code
中的我的回购损坏,
code备份
repo是否会自动损坏,因为克隆操作使用了指向原始回购的硬链接?因此,我的双云备份策略将毫无用处

注:我知道退后选项是使用云服务恢复以前已知的良好状态


更新:仔细研究之后,我将添加这些内容以供参考

问题是,如果完成了“hg克隆”(没有--pull选项),那么 目标和源repo在.hg/storeby内共享文件 如果文件系统提供硬链接,则使用硬链接 功能(NTFS不支持)

Mercurial设计用于在提交时中断.hg内部的此类硬链接 或者对其中一个克隆进行推送。前提是,, mercurial使用的Windows API应该给出正确的答案, 如果mercurial询问“此文件上有多少硬链接?”

我们发现这个答案几乎总是错误的(总是报告) 1,即使它实际上大于1)如果hg进程在一台计算机上运行 Windows计算机和存储库文件位于 不同的Windows计算机

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

    hg clone-U——拉c:\Dropbox\code c:\GoogleDrive\code备份

  • 要检查硬链接,请执行以下操作:

    :显示

    :显示硬链接>1的所有文件

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


您的
代码
存储库可能会损坏的唯一方式(假设您最初将其克隆到
代码备份
时它没有损坏)是在您向其写入内容时,可以是提交、重写历史记录等。每当有内容写入硬链接文件时,Mercurial会首先中断硬链接,创建文件的独立副本,然后仅修改新创建的副本


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

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


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

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

不要那样做

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

  • 您的机器永远不会失去互联网连接
  • 一次在多台计算机上(包括出现internet问题的时候)不会有未同步的新更改
  • 该Dropbox将始终运行(永不丢失internet连接的变体)
  • 你不只是在时机上很不走运
  • 要验证Dropbox是否容易导致存储库损坏,请执行以下操作:

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

    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!
    

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

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

    不要那样做

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

  • 您的机器永远不会失去互联网连接
  • 一次在多台计算机上(包括出现internet问题的时候)不会有未同步的新更改
  • 该Dropbox将始终运行(永不丢失internet连接的变体)
  • 你不只是在时机上很不走运
  • 要验证Dropbox是否容易导致存储库损坏,请执行以下操作:

  • 导航到Dropbox或Google Drive文件夹中的文件夹,并在此处创建Mercurial存储库。在一台机器上做这个,我们把这台机器叫做A
  • 向其中添加3个文本文件,其中包含一些内容(不是空的),然后提交这3个文本文件