如果存在git index.lock,我可以安全地删除它,还是需要更多动作来验证完整性?

时间:2013-12-29 11:38:19

标签: windows git

在过去的几周里,我收到了一条关于index.lock存在几次的消息。

删除该文件作为解决方案提到 git index.lock File exists when I try to commit, but cannot delete the file

是否正在删除该文件,或者我是否需要执行其他操作(有没有办法验证完整性等等?)。

这是在使用git命令行工具,TortoiseGIT和SourceTree安装的Windows x64系统(完全修补)上。

1 个答案:

答案 0 :(得分:5)

other answers没有提及index.lock的内容 然而,它在Git发行版中记录在文件“Documentation/technical/api-lockfile.txt”下。

  

是否足够删除该文件?

根据该文档,似乎删除就足够了。

lockfile API

  

lockfile API有两个目的:

     
      
  • 相互排斥
      当我们写出一个新的索引文件时,首先我们创建一个新文件$GIT_DIR/index.lock,将新内容写入其中,然后将其重命名为最终目标$GIT_DIR/index。我们尝试使用O_EXCL创建$GIT_DIR/index.lock文件,以便在其他人已经尝试更新索引文件时我们可以注意到并失败。

  •   
  • 自动剔除
      在我们创建“锁定”文件后,我们可能决定die(),我们希望确保删除尚未提交到其最终目的地的文件。
      这是通过记住我们在链表中创建的锁定文件并从atexit(3)处理程序中清除它们来完成的。当程序死于信号时,也会删除未完成的锁定文件。

  •   

在Windows上,不应存在权限问题(例如将该文件创建为“root”的一个Git工具)。
唯一的问题是您的一个Windows工具:

  • 可以在系统帐户下运行,而不是在用户帐户
  • 下运行
  • 或开始暂存文件(意味着创建索引并创建index.lock文件),并使用另一个工具来启动同一个仓库中的暂存文件。

考虑到该文件是在O_EXCL锁定方案下创建的,很可能无法创建它,因为它被另一个PID锁定。
正如mentioned here

  

唯一的事情O_EXCL会导致调用失败,如果文件存在且指定了O_CREAT


2015年8月更新,git 2.6 +(2015年第3季度)

The "lockfile" API has been rebuilt on top of a new "tempfile" API.

commit 9e90331commit 18a3de4commit ebebeaecommit 00539ce,...(巨额列表),commit 2db69de(2015年8月10日){{3 }}。
(由Michael Haggerty (mhagger)合并于Junio C Hamano -- gitster --,2015年8月25日)

tempfile API允许创建,删除和原子重命名临时文件 程序结束时仍处于活动状态的临时文件会自动清除 Lockfiles构建在此API之上。