Git存储库是否可以进行并发操作?

时间:2012-10-23 21:00:14

标签: git

有两种情况我很感兴趣。

  • 存储库是共享的,两个用户希望同时推送更改
  • 我想使用cron作业安排每晚或每周“gc”。它运行,有人想在操作期间推送或克隆。

这两种情况都存在腐败风险吗?

3 个答案:

答案 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 f1350d0Matt McCutchen (mattmccutchen)(2016年11月15日) Junio C Hamano -- gitster --于2017年1月10日commit 979b82f合并)

请参阅Jeff King's comment

  

现代版的git做了两件事来帮助解决这个问题:

     
      
  • “最近”对象引用的任何对象(在2中   周)也被认为是最近的。所以如果你创建一个新的提交   即使在引用提交之前,指向树的对象   该树受到保护

  •   
  • 当对象写入被优化时,因为我们已经有了   对象,git将更新文件上的mtime(松散的对象或   packfile)来清新它

  •   
     但是,这并不完美。您可以决定引用现有的   对象就像它被删除一样。修剪过程本身就是   不是原子的(而且因为我们的原因而制造它是很棘手的   由文件系统承诺。

     

如果您有长时间运行的数据(例如,可能是临时索引文件)   字面上坐了几天或几周)我认为这是一个潜力   问题。解决方案可能是以某种方式使用refs来指出   你的对象。
  如果你担心短期操作在哪里   有人碰巧同时跑git-gc,我同意这是可能的   问题,但我怀疑你在实践中可以忽略的东西。

     

对于繁忙的多用户服务器,我建议完全关闭auto-gc,   并使用“-k”手动重新打包以保证安全。

这就是git gc man page现在包括:

的原因
  

另一方面,当'git gc'与另一个进程同时运行时,   存在删除其他进程正在使用的对象的风险   但尚未创建引用。这可能只会导致其他过程   如果其他进程稍后添加a,则失败或可能损坏存储库   对已删除对象的引用。

     

Git有两个功能可以显着缓解这个问题:

     
      
  • 保留任何修改时间比--prune更新的对象,   以及从中可以到达的一切。

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

  •   
     但是,这些功能缺乏完整的解决方案,所以用户是谁   并发运行命令必须承受一定的腐败风险(其中   实际上似乎很低)除非他们关闭自动垃圾   使用'git config gc.auto 0'收集。

关于最后一句的注释,包括“除非他们关闭自动垃圾”:Git 2.22(2019年第二季度)修改gc文件。

请参阅commit 0044f77commit daecbf2commit 7384504commit 22d4e3bcommit 080a448commit 54d56f5commit d257e0f,{{3} (2019年4月7日),commit b6a8d09commit fc559fbcommit 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,则会遇到严重问题。我即将就此提交报告。我看不出为什么这不可能或为什么会引起问题。