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

时间:2009-11-24 19:31:57

标签: mercurial backup timestamp

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分: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是一个备注程序的例子,会注意到这一点。

答案 2 :(得分:3)

这是一个可能有用的hg扩展程序:TimestampExtension

相关问题