git rebase: "错误:不能stat '文件':权限被拒绝"

我正在使用git,并进行了一个小的提交,然后是一个大的提交。我决定使用git rebase将两个提交压缩在一起。(我以前从未这样做过。)

于是我做了:

git rebase -i HEAD~2

这给了我一个编辑器,我选择选择较早的提交并删除较晚的提交。我攒钱的时候,少不要脸的人说:

error: cannot stat '文件名':权限被拒绝

无法应用Sha1稍后提交提交的初始文本行

现在:

  • 当我执行git log时,两者都没有提交。
  • git status告诉我“目前不在任何分支上”;
  • 一个文件被列为已修改并在索引中,两个文件被列为未跟踪。我的第一次提交只有一个文件(我想),而我的第二次提交有一打。

!发生了什么?我该怎么解决呢?

285998 次浏览

我只在Windows上见过这个错误,这似乎意味着当git试图应用补丁时,有什么东西阻止了它修改文件。

Windows倾向于在不必要的时候给予进程对文件的独占访问,在过去病毒检查一直是怀疑的来源之一,但我从未最终证明过这一点。

也许最简单的方法就是放弃,然后再试一次,希望下次不会发生这种情况。

git rebase --abort

你可以尝试使用git apply,并在使用git rebase --continue之前了解commit git实际上试图做什么,但老实说,我不建议这样做。大多数时候,我看到这种尝试,有一个比偶数更好的机会,一些东西被不小心错过或搞砸了。

在Windows上,它可以是一个TortoiseGIT进程阻止这些文件。 打开任务管理器并结束进程TGitCache.exe。< / p >

如果您使用的IDE(如果您使用了IDE)也可能成为阻碍。这就是我在使用QtCreator时遇到的情况。

当我在我的机器上看到这个时,它比“某个进程打开了文件”更糟糕。文件的实际所有权上升到我(以管理员身份运行)只能在重新启动后才能访问它的位置。

据我所知,IIS是问题的一部分。如果我在两个需要修改大量文件的主要分支之间切换,git会在IIS试图对其进行某些操作时删除一个文件或目录(通常是dll)。此时,IIS进程会自动用一个锁定的版本覆盖磁盘上的文件,该版本似乎不属于任何人。

在这里停止IIS并不能做到这一点。我发现最好的方法是重新启动,并且记住在将来跨主要分支进行更改之前停止IIS。

我知道这并不能真正回答问题,但可能对其他人有帮助。

尝试关闭所有打开该文件夹的程序,如编辑器、资源管理器窗口、命令提示符和FTP程序。这总是能解决我在Windows上的问题。

我们通过右键单击程序文件中的sh.exe并在安全选项卡中设置“以管理员身份运行”来解决权限问题。

我遇到这个问题是由我的编辑Intellij引起的。作为其内部版本控制的一部分,它已经检查并锁定了所有隐藏的git文件。(由于各种原因,我没有使用Intellij附带的git插件…)

所以我以管理员身份打开一个普通的dos窗口,切换到目录,然后执行

attrib -R /S

这消除了文件上的锁,在那之后一切都正常了,我可以使用GitHub windows客户端同步我的更改。

关闭你的IDE (VISUAL STUDIO/ATOM等)。可能会有用

当我的VS1013在一个针对8.1的分支上,我试图签出一个8.0分支时,我得到了这个错误。我需要回到VS并允许它UpdateAll。然后我就可以顺利地签出8.0的分支了。

我同意上述“关闭Visual Studio”的答案。

然而,即使在我关闭Visual Studio之后,我也必须做的另一个步骤是在任务资源管理器中手动杀死 “devenv.exe” Visual Studio进程。 在我这样做之后,我能够再次运行在gitbash:

git拉

“cannot stat 文件名”错误消失。这可能是由于Visual Studio扩展使进程在关闭后仍然保持更长的时间。

我也是在使用Git Shell的Windows机器上遇到同样的错误。

但是,当时我打开了多个Git终端。

第一个终端收到了你上面发布的错误,而另一个终端之前已经从yeoman运行了grunt serve终端命令(链接如下)。第二个终端需要保持打开状态以承载本地服务器实例。

关闭所有正在运行的进程的终端窗口可以使错误消失。

至少对我来说是这样的。在我关闭第二个终端窗口后,我可以轻松地签出不同的分支并操作文件。

咕哝服务命令-约曼。I / O < br > http://yeoman.io/learning/ < / p >

这也可能发生在你使用SublimeText和弹出窗口,要求你购买程序没有关闭。

我也有类似的问题。但是解决起来很简单。 在一台Windows机器上,我的文件资源管理器打开了一个文件夹,它存在于一个分支中,但不存在于我签出的另一个分支中。

.关闭文件资源管理器解决问题

我刚刚在win7下玩了这个。

$ git stash pop error: cannot stat 'parentFolder/subfolder':权限被拒绝 error: cannot stat 'parentFolder/subfolder':权限被拒绝

诊断:

我去了子文件夹,它在那里,我不能删除它!

2>使用“进程资源管理器”->查找->查找句柄和dll ->将“子文件夹”的名称放在那里并搜索。

结果:原来它的XMLSpy已经打开了其中一个xml,关闭xml Spy并尝试再次隐藏流行,它现在正在工作。

我只是偶然发现了这个答案-这个错误是一个虚假的错误 错误:不能统计'reddit/app/views/links':权限被拒绝

当我尝试合并时,这就是我得到的。 我读了一些答案,然后意识到-我所要做的就是关闭我的代码编辑器,这恰好是Atom.

一旦关闭编辑器-我再次运行“git合并”,它工作了。

真是一个毫无意义的错误:(

我刚刚遇到了这个问题。这里没有一个答案能帮我解决这个问题。

最终是我在一个分支上添加的nuget包,一旦切换回主分支,似乎不存在。一旦我做了合并,它会说newtonsoft…xml不能统计。我会去文件的问题,打开它,但Windows抛出一个错误,说它无法找到文件(即使我正看着它)

我解决这个问题的方法是右键单击删除文件(这是有效的,但我无法打开它,因为windows找不到它??),并尝试再次合并,它解决了这个问题。

很奇怪。

希望这对以后的人有所帮助。

同样的问题在Windows 10 64位,运行Git Bash版本2.9.0.windows1 使用Atom作为我的编辑器。

这对我来说很有效:我将Git软件文件夹(对我来说,这是C:\Program Files\ Git)添加到Windows Defender的排除项中。

添加排除后,git checkout 'file'工作正常。

我退出了正在访问项目目录的文本编辑器,然后尝试合并到主分支,它工作了。

此错误也可能是由于之前的git操作导致文件仍然处于“锁定”状态。它与Windows文件系统层的工作方式有关。我曾经读过一个很好的解释,但我不记得在哪里了。

然而,在这种情况下,由于它基本上是一个竞态条件,你所要做的就是继续中断的改基过程。不幸的是,这种情况一直发生在我身上,所以我写了这个小危险的帮助器来保持我的rebases继续进行:

#!/bin/sh


set -e


git checkout .
git clean -df
git rebase --continue

如果你想更加确定,你可以使用git rebase --edit-todo来检查下一个要应用的提交是否真的是之前应用失败的那个。使用git clean -dn来确保你不会删除任何重要的文件。

同样的问题,但使用SourceTree(或任何其他git客户端)。我加上我的答案,因为没有一个答案与我的情况相对应。

将分支从“develop”改为“main”将更改本地文件夹的实际文件和子文件夹。可能发生的情况是,一个不存在于“master”中的文件夹没有被完全擦除,windows认为你只是失去了访问权限(即使你是管理员)。 当从main合并到develop时,git客户端尝试访问该文件夹。如果没有访问权限,则返回上述错误

    从一个分支切换到最新的分支可以解决问题,然后 回到主(再次检查是否文件夹/文件实际上 在本地删除)。李< / >
  • 关闭客户端和/或编辑器解决不了问题!
  • 重启有帮助,但是浪费时间(恕我直言)

我刚刚遇到了这个问题。问题是-如果你打开了文件,它在rebase之后被删除/替换(你有一个不再有这个文件的分支),git系统就会崩溃。所以我关闭了所有打开的文件,然后尝试在其他分支签出

发生在我在windows中,当使用photoshop时: 当我保存一个图像,然后切换到一个分支(离开photoshop与图像打开),我得到了git错误。在photoshop中关闭图像并重试

在我的情况下,该文件是一个shell脚本(*.sh文件),旨在为我的开发人员将我们的项目部署到本地开发服务器。

shell脚本应该工作一致,并且可以更新;所以我跟踪它在相同的Git项目的代码,脚本是要部署。

shell脚本运行一个可执行文件,然后允许该可执行文件运行;所以脚本仍在运行;所以我的shell仍然打开脚本;所以它是锁定的。

我__abc0d杀死脚本(所以现在我的本地开发服务器不再可访问),现在我可以自由签出。

如果你打开了合并工具,关闭它。阻止文件覆盖。

这通常发生在预处理软件/应用程序监视项目时,比如Prepros或Codekit。此外,Atom和Sublime(甚至notepad++)可以导致这种情况发生,如果项目中的文件当前正在编辑。

解决这个问题最简单的方法是关闭任何打开项目文件的文件,合并分支,然后重新打开它们以刷新它。这也将避免任何问题,即程序不再意识到已经发生的任何更改,迫使您手动刷新项目。

杀死与存储库相关的w3wp.exe进程为我修复了这个问题。

在win10中使用SourceTree,通过关闭Atom编辑器修复了这个问题。

错误重现:

  1. 在分支B中,创建一个md文件,使用Atom编辑、保存并提交。
  2. 切换到分支A,从服务器上拉下新的提交。
  3. 尝试切换回来,哎呀,它说“错误:不能统计‘文件’:权限被拒绝”。

我在Windows中偶尔会遇到这种情况

错误:不能stat 'filename':权限被拒绝

大多数情况下,我打开了多个bit bash实例,其中一个git bash实例位于我所从的远程分支中不存在的目录中。

关闭除了一个实例之外的所有git bash实例为我解决了这个问题。

在我的例子中,我有一个webpack开发服务器在后面运行。

发生在我在Windows上,而在IntelliJ集成终端内重基。 我注意到我有Git bash客户端实例并行运行

关闭Git bash解决了这个问题。

如果你正在运行webpack,请关闭它。同时关闭您的IDE。做完这些事情后应该能正常工作。

一个替代的解决方案,而不是关闭所有可能锁定目录的应用程序,就像其他答案所说的那样,将使用一个实用程序,将解锁文件/目录,而不关闭一切。(我讨厌重新启动Visual Studio)

LockHunter是我使用的一个:https://lockhunter.com/可能还有其他人,但这一个对我来说非常有用。

如果使用vscode,杀死终端并打开一个新的。 否则可能关闭终端

试图关闭IDE,如Sublime, VS Code, Webstorm,…关闭打开该文件夹的程序,如CMD、Powershell、cder、Terminal…会解决这个问题。

在我的情况下,只需更新git客户端到最新版本,解决了这个问题。

https://git-scm.com/downloads

我在Windows 10上,我得到了这个错误,但即使在电脑重新启动并使用管理权限打开后,也没有解决我的问题。

看来问题出在我的存储库特权上。

只是为了确保我安装了所有新的Windows更新,然后 我重启了我的电脑,最后我删除了所有不必要的特权

以管理员身份运行powershell,执行如下命令:

attrib -s <path_to_your_directory>
attrib -r -a <path_to_your_directory>
powershell命令的详细信息如下: https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/attrib < / p >