Git gc 或 prune 与接收并发

Git gc 或 prune 与接收并发

有两台主机A、B。

A 提供 Git 服务并接收从 B 推送的修订。

B 只会推,不会接,除非自己拉。

可以将 B 设置为 GC 或修剪转速,因为不用担心并发操作,但是当 A 进行 GC 或修剪时,B 可以将转速推送给 A 吗?会发生什么?

我基本上想知道在运行 GC 或修剪时是否要拆除 A 的通信,或者没有必要这样做。

答案1

Git GC手册页状态:

如果 git gc 与另一个进程同时运行,则存在删除另一个进程正在使用但尚未创建引用的对象的风险。这可能会导致另一个进程失败,或者如果另一个进程稍后添加对已删除对象的引用,则可能会损坏存储库。Git 有两个功能可以显著缓解此问题:

  1. 任何修改时间晚于 --prune 日期的对象以及可从其访问的所有内容都会被保留。

  2. 如果对象已经存在,则将对象添加到数据库的大多数操作都会更新对象的修改时间,因此 #1 适用。

然而,这些功能并不是一个完整的解决方案,因此同时运行命令的用户必须忍受一定的损坏风险(实际上这种风险似乎很低)。

并进一步:

--prune=<date>

修剪超过日期的松散对象(默认值为 2 周前,可由配置变量 gc.pruneExpire 覆盖)。--prune=now无论松散对象的年龄如何,都会对其进行修剪,并且如果另一个进程同时写入存储库,则会增加损坏的风险;请参阅下面的“注意事项”。--prune 默认处于启用状态。

所以是的,存在风险。但是,如果 A 和 B 的时钟相当同步,并且您应用于存储库的 Git 命令完成时间不超过两周,我会认为同时推送到同一存储库并对其进行 GC 的风险是可以接受的。

相关内容