在保留时间戳的同时备份mercurial存储库

Jim*_*ker 6 backup mercurial timestamp

有没有办法在保留文件的时间戳的同时备份mercurial存储库?

现在,我正在使用hg clone将存储库复制到临时目录,备份程序从那里获取文件.我没有将备份程序直接指向存储库,因为我不希望它在备份发生时更改(来自提交).

问题是将hg clone所有文件的时间戳更改为当前时间,因此备份程序(我无法更改)认为所有内容都已被修改.

int*_*tgr 6

计划A:当源和目标目录驻留在同一文件系统上时,hg clone -U只需将其所有文件硬链接在存储库中,而不更改时间戳.这种方法非常快速且始终安全(文件在写入时懒惰地取消链接).

如果需要,可以先在同一文件系统上进行克隆,然后将此新克隆rsync同步到另一个文件系统.

B计划:这是通常的安全使用rsync或其他一些基于文件的同步工具.Mercurial不会在磁盘上存储任何神奇的东西,只是普通文件.

有一个竞争条件,当你碰巧在rsync运行的同时提交到这个存储库时,但我认为它可以忽略不计,因为hg rollback如果从一个损坏的备份恢复," "应该能够清理你的这种不一致.请注意,如果在rsync窗口中有多个单独的事务(例如多个"push"或"commit"命令),或者运行篡改历史记录的破坏性操作(例如rebase ,和某些MQ命令),则回滚无法恢复hg strip.


Mar*_*ler 5

我建议使用hg pull而不是hg clone.因此,您将在服务器上保留存储库的镜像,并定期更新它hg pull.然后,让你的备份程序采取的备份.当您使用时,hg pull您将转移最新的历史记录,并且仅转换.hg/store/data实际受拉动影响的文件.

在这里,我通过制作一个包含两个文件的小型回购来测试这个:a.txtb.txt.然后我使用了将存储库"克隆到服务器" hg clone --noupdate.这确保了我们在服务器上没有工作副本 - 它只需要找到的历史记录.hg.

克隆后的时间戳如下所示:

% ll --time-style=full .hg/store/data
total 8.0K
-rw-r--r-- 1 mg mg 76 2009-11-25 20:07:52.000000000 +0100 a.txt.i
-rw-r--r-- 1 mg mg 69 2009-11-25 20:07:52.000000000 +0100 b.txt.i

正如您所指出的,它们都是相同的,因为文件都是由克隆操作创建的.然后我更改了原始存储库(客户端上的存储库)并进行了提交.拉动变更集后,我得到了这些时间戳:

% ll --time-style=full .hg/store/data
total 8.0K
-rw-r--r-- 1 mg mg 159 2009-11-25 20:08:47.000000000 +0100 a.txt.i
-rw-r--r-- 1 mg mg  69 2009-11-25 20:07:52.000000000 +0100 b.txt.i

注意时间戳是如何a.txt.i更新的(我只a.txt在我的提交中触及),而时间戳b.txt.i保持不变.

如果您的备份软件是智能的,它甚至会注意到Mercurial只附加了数据a.txt.i.这意味着新a.txt.i文件a.txt.i在某一点上与旧文件相同- 因此备份程序只应复制文件的最后部分.Rsync是一个备注程序的例子,会注意到这一点.