Git从index.lock重命名为索引失败

使用GitHub Windows客户端,我做了一个同步来将远程更改提取到本地计算机,但是在完成同步之前,我的磁盘空间不足,同步失败。 现在我似乎有一堆本地的变化,实际上是从原点拉出的变化。 我试图运行git pull但得到:

C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git pull Updating b3a86e1..5afd74f error: Your local changes to the following files would be overwritten by merge: SourceLog.Interface/IChangedFile.cs SourceLog.Interface/ILogEntry.cs ... Please, commit your changes or stash them before you can merge. error: The following untracked working tree files would be overwritten by merge: Lib/MSBuildExtensionPack/4.0.6.0/Ionic.Zip.dll Lib/MSBuildExtensionPack/4.0.6.0/MSBuild.ExtensionPack.dll ... Aborting 

所以现在我试图放弃本地的变化,但我得到:

 C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git checkout -- . Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n fatal: unable to write new index file 

我怎样才能清理呢? (在开始同步之前,我没有任何本地更改。)

更新

似乎无法重置头..

 C:\Users\Tom\SourceLog [master +4 ~0 -0 !]> git reset head Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n error: Could not write new index file. fatal: Could not reset index file to revision 'head'. 

看起来像下面的过程对.git\index文件有一个锁:

 ssh-agent.exe C:\Users\Tom\AppData\Local\GitHub\PortableGit_8810fd5c2c79c73adcc73fd0825f3b32fdb816e7\bin\ssh-agent.exe 

我杀了这个进程,然后运行git reset HEAD ,看起来我现在恢复了正常。

我的解决方案是重新创建index (同时保持工作树完整):

 del .git\index git reset --mixed head 

放弃本地更改,去

 git reset HEAD 

然后检查你的旧提交,删除新的,并再次拉。

 git checkout "hashOld" git branch -d "hashNew" git pull 

我和Git有类似的问题。 我的解决方案是通过Windows资源管理器本地删除解决方案,然后重新克隆存储库。 这删除了我的机器本地存储的所有文件,并导致了

 Rename from '.git/..' to '.git/..' failed. Should I try again? (y/n) y 

离开。 在克隆版本库后,我再次尝试了我的命令(在我的例子中是GIT COMMIT),并且没有再次发生。

当我试图解决合并功能分支到开发分支后发生的合并冲突时,问题出现了。

Git 2.10(2016年第三季度,4年后)应该改善Windows的状况

参见Ben Wijen( Ben )的 提交05d1ed6 (2016年8月23日) 。

mingw :确保临时文件句柄不mingw进程继承

当索引被锁定并且子进程继承所述锁的句柄并且父进程想要​​在子进程退出之前移除锁时,在Windows上存在一个问题:它不起作用,因为如果进程持有文件不能被删除对他们的处理。

症状:

 Rename from 'xxx/.git/index.lock' to 'xxx/.git/index' failed. Should I try again? (y/n) 

使用bInheritHandles==FALSE子进程将无法工作,因为没有文件句柄会被继承,甚至不会在STARTUPINFO (stdin / stdout / stderr)中使用hStdXxx句柄。

使用O_NOINHERIT打开每个文件都不起作用,例如git-upload-pack需要继承的文件句柄。

这给我们留下了唯一的出路:用O_NOINHERIT标志创建临时文件。 但是,此标志是特定于Windows的。
出于我们的目的,它相当于O_CLOEXEC (在Windows上不存在),所以让我们用O_CLOEXEC标志打开临时文件,并将O_CLOEXEC标志 映射到Windows上的O_NOINHERIT

要么杀死正在锁定文件的进程,要么是新的回购,删除.git文件夹rm -rf .git ,然后用git init

在一个存储在Google云端硬盘文件夹中的项目中运行git reset HEAD时,我连续多次得到这个错误,但几分钟后问题就消失了。

我删除了indexindex.lock (在.git文件夹),并运行git checkout . 以撤消更改和解决,但如果我想提交更改,我会运行git add -A git commit -m "description"