有没有办法在保留文件的时间戳的同时备份mercurial存储库?
现在,我正在使用hg clone
将存储库复制到临时目录,备份程序从那里获取文件。我没有将备份程序直接指向存储库,因为我不希望在备份发生时更改(来自提交)。
问题是hg clone
将所有文件的时间戳更改为当前时间,因此备份程序(我无法更改)认为所有内容都已被修改。
答案 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.txt
和b.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。