有两种情况我很感兴趣。
这两种情况都存在腐败风险吗?
答案 0 :(得分:11)
Git允许使用Pessimistic Concurrency Control进行并发操作。
必要时,git会创建一些特殊文件作为锁。
特别是,每次操作修改索引时,git都会在index.lock
目录中创建一个名为.git
的文件来锁定共享资源。 Git根据需要创建其他锁文件:例如,在git index-pack操作期间创建.keep
文件。
一般情况下,您不必担心使用git进行并发操作:它经过精心设计以支持它们。
有人可以告诉你不要担心使用cron作业执行gc
,因为git本身会不时触发gc
。即使这是真的,man page本身也会建议:
Users are encouraged to run this task on a regular basis
within each repository to maintain good disk space utilization
and good operating performance.
因此,我认为安排一个工作任务来运行git的垃圾收集并不是一个坏主意。我只是想知道这是不成熟的优化还是你想要解决一个真实的,有问题的问题。我个人从来没有遇到过需要我手动运行gc
的问题,但如果你的情况大不相同,我也不会感到惊讶。
答案 1 :(得分:2)
通常,“git gc
”可能会删除另一个并发进程的对象
正在使用但尚未创建参考。
Git 2.12(2017年第一季度)有更多内容。
commit f1350d0见Matt McCutchen (mattmccutchen
)(2016年11月15日)
(Junio C Hamano -- gitster
--于2017年1月10日commit 979b82f合并)
现代版的git做了两件事来帮助解决这个问题:
但是,这并不完美。您可以决定引用现有的 对象就像它被删除一样。修剪过程本身就是 不是原子的(而且因为我们的原因而制造它是很棘手的 由文件系统承诺。
“最近”对象引用的任何对象(在2中 周)也被认为是最近的。所以如果你创建一个新的提交 即使在引用提交之前,指向树的对象 该树受到保护
当对象写入被优化时,因为我们已经有了 对象,git将更新文件上的mtime(松散的对象或 packfile)来清新它
如果您有长时间运行的数据(例如,可能是临时索引文件) 字面上坐了几天或几周)我认为这是一个潜力 问题。解决方案可能是以某种方式使用refs来指出 你的对象。
如果你担心短期操作在哪里 有人碰巧同时跑git-gc
,我同意这是可能的 问题,但我怀疑你在实践中可以忽略的东西。对于繁忙的多用户服务器,我建议完全关闭auto-gc, 并使用“
-k
”手动重新打包以保证安全。
这就是git gc
man page现在包括:
另一方面,当'
git gc
'与另一个进程同时运行时, 存在删除其他进程正在使用的对象的风险 但尚未创建引用。这可能只会导致其他过程 如果其他进程稍后添加a,则失败或可能损坏存储库 对已删除对象的引用。Git有两个功能可以显着缓解这个问题:
但是,这些功能缺乏完整的解决方案,所以用户是谁 并发运行命令必须承受一定的腐败风险(其中 实际上似乎很低)除非他们关闭自动垃圾 使用'git config gc.auto 0'收集。
保留任何修改时间比
--prune
更新的对象, 以及从中可以到达的一切。将对象添加到数据库的大多数操作都会更新 如果对象已经存在则修改对象的时间,以便#1 适用。
关于最后一句的注释,包括“除非他们关闭自动垃圾”:Git 2.22(2019年第二季度)修改gc文件。
请参阅commit 0044f77,commit daecbf2,commit 7384504,commit 22d4e3b,commit 080a448,commit 54d56f5,commit d257e0f,{{3} (2019年4月7日),commit b6a8d09,commit fc559fb,commit cf9cd77(2019年3月22日)commit b11e856。
(Ævar Arnfjörð Bjarmason (avar
)合并于Junio C Hamano -- gitster
--,2019年4月25日)
的错误引用
gc
docs:删除对gc.auto=0
由于“
gc
”导致存储库损坏的可能性无效 是否通过“gc --auto
”调用“gc”,但是 是否还有其他并发操作。这段已在前面提到过,因此没有理由在此提出建议。用户可以从文档的其余部分推断出“
gc
”将自动运行,除非设置gc.auto=0
,我们不应该通过暗示“gc --auto
”以某种方式混淆该问题比普通的“gc
”更容易产生腐败。嗯,从某种意义上说,阻止“
gc
”会阻止你 在 特定的终端窗口中做其他事情,但是用户 可能会有另一个窗口,或者担心如何 服务器上的并发“gc
”可能会导致损坏。
答案 2 :(得分:0)
如果我在同一台计算机上同时在多个存储库上运行git status
,则会遇到严重问题。我即将就此提交报告。我看不出为什么这不可能或为什么会引起问题。