我在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
:显示每个文件旁边的硬链接数
答案 0 :(得分:6)
关于存储库损坏,这里最大的问题是您使用Dropbox和Google Drive来跨机器同步存储库。
不要那样做!
这肯定会导致存储库损坏,除非您能保证:
要验证Dropbox是否容易导致存储库损坏,请执行以下操作:
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!
答案 1 :(得分:1)
code
存储库损坏的唯一方法(假设它最初克隆到codeBackup
时没有损坏)是当你写某些东西时,无论是什么东西被写入硬链接文件,Mercurial首先打破硬链接,创建文件的独立副本,然后只修改新创建的副本。
所以回答你的问题:在正常使用情况下,存储库损坏将不传播到你的codeBackup
存储库。