Git for Windows - 防止.pack文件日期/时间修改

时间:2017-12-21 05:17:47

标签: windows git metadata pack

我正在使用Git for Windows(版本2.15,但同样的问题发生在2.14,我认为旧版本也是如此)我注意到一个相当讨厌的行为:当我执行一些基本的git操作*)时,修改日期为.git / objects / pack / pack - * .pack文件更改。文件本身保持不变,但最后修改日期字段会更新,这会导致我的备份软件认为文件已更改,需要添加到差异备份中。因为我的.pack文件相当大,这大大增加了我每日备份的大小。有没有办法防止这种行为?也就是说,保持包文件完全不变,包括其元数据,直到我执行git gc或git repack?

不幸的是,我无法确定哪种操作会导致此行为。当它发生在今天,我只使用git status,git log,git add,git mv和git commit而没有其他任何东西,并且日期/时间发生了变化,但是当我尝试在昨天的备份中复制行为时,日期变更没有发生。我想下次我将运行Process Monitor并观察对该文件的访问,但与此同时,是否有人知道可能导致此问题的原因?感谢。

3 个答案:

答案 0 :(得分:2)

您可以拥有:

而不是引用您的Git仓库本身来处理备份程序(使用日期问题)

这样,您完全绕过了这些包文件的修改日期问题。

您可以保存并保留一整套回购的副本。
或者制作增量包。

答案 1 :(得分:1)

如果您尝试禁用此功能,那么您将很容易看到仍在使用的对象将从您的存储库中消失的细微错误。

您无法精确定位确切的操作,因为添加文件的每个操作都会执行此操作。

这是非常有意的 - Git刷新数据库中对象的时间戳(更新松散对象或packfiles上的时间戳)以了解上次写入对象的时间。无论何时创建新提交,它都会更新包含引用帽子的所有文件的时间戳。

这很重要,因为它有助于删除数据的工具(如修剪)避免竞争条件:可以取消引用对象然后重新引用。 Prune还将查看时间戳,因此通过触摸该文件,它将无法进行垃圾回收。

答案 2 :(得分:1)

最后,事实证明Edward Thomson的答案解释了为什么没有“真正的”解决方案是可能的。但是,为了满足我的需求,我编写了一个简单的Windows命令行应用程序,它扫描目录树,找到可能的Git存储库,找到它们的包文件,并将每个.pack文件的日期/时间更改为相应的.idx文件的日期/时间。文件。到目前为止似乎运行正常。无论如何,我还没有遇到任何垃圾收集问题。我还没有发布这个工具,因为我很怀疑别人不关心,但如果有人感兴趣,我可以将它上传到某个地方。

显然,某人有兴趣。所以该程序截至目前已发布。不是在GitHub上,而是在3条款BSD许可下仍然是开源的。在此处下载二进制文件:https://www.pepak.net/files/git/gitpacksync-0.01.zip 和源代码:https://www.pepak.net/files/git/gitpacksync-0.01-source.zip