【问题标题】:git rebase: "error: cannot stat 'file': Permission denied"git rebase:“错误:无法统计'文件':权限被拒绝”
【发布时间】:2011-05-11 21:33:34
【问题描述】:

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

所以我做到了:

git rebase -i HEAD~2

这给了我我的编辑器,我选择选择较早的提交并压缩后的提交。我保存的时候,git说:

错误:无法统计“文件名”:权限被拒绝

无法为以后的提交应用 sha1... 该提交的初始文本行

现在:

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

发生了什么!?我该如何解决?

【问题讨论】:

  • 你是否偶然在 Windows 上使用 git?
  • 是的。我在 DOS 窗口中运行命令。
  • 您是否正在运行病毒检查程序?有时质量差的病毒检查程序会导致这样的问题。
  • 我遇到了 git checkout 的问题(所以不能按照接受的答案的建议中止),但关闭我所有的 IDE 让我通过。第二个答案应该是公认的
  • @IanGrainger,您所指的答案是在接受答案后 八个月 发布的。我是否需要每隔几个月来一次并访问我所有的问题,以潜在地改变所有这些问题的公认答案?投票按钮的存在是有原因的。如果最受好评的答案比接受的答案更能帮助您,请使用它。谁在阻止你?但我接受了我所做的答案,因为它对我有帮助,而且我是提出这个问题的人。

标签: git git-rebase


【解决方案1】:

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

【讨论】:

  • 我遇到了同样的错误。我刚刚关闭了视觉工作室,一切正常。
  • 在我想起 WinLess LESS -> CSS 转换器隐藏在后台之前,我关闭了几乎所有我能想到的东西。
  • 当我尝试合并时,Visual Studio 锁定了一个 nuget 包。关闭 VS 对我有用。
  • 我在 Windows 上看到的这个错误的最常见来源是 Visual Studio 锁定了文件。按照规定,在切换分支、合并等之前关闭VS。
  • “我也是”Atom 的答案。它似乎锁定了文件和目录;关闭它可以解决问题。
【解决方案2】:

只需关闭您的 IDE(VISUAL STUDIO/ATOM 等)。它可能会起作用

【讨论】:

  • 在 IntelliJ 中,停止运行的 Tomcat 服务对我有用。比重启 IDE 稍微容易一些。
  • 我还打开了一个 Git Bash 窗口 - 关闭它对我有用。
  • 任何值得一提的 IDE 都不应该在 repo 中锁定任何东西...竖起大拇指!!
  • 在 Windows 10 上使用 Atom 签入临时分支后遇到此问题。关闭并重新打开 Atom 为我解决了该问题。
【解决方案3】:

我只在 Windows 上看到过这个错误,这似乎意味着当 git 尝试应用补丁时,某些东西阻止了它修改文件。

Windows 往往会在确实没有必要时赋予进程对文件的独占访问权限,过去病毒检查程序一直是怀疑的来源之一,但我从未最终证明这一点。

可能最简单的做法是中止并重试,希望下次不会发生。

git rebase --abort

在执行git rebase --continue 之前,您可以尝试使用git apply 并了解git 实际尝试执行的操作,但老实说,我不推荐这样做。大多数情况下,我都看到这种尝试有比偶数更好的机会意外遗漏或搞砸。

【讨论】:

  • @Kyralessa:嗯,你试过重启吗?如果某些东西持续锁定该文件,那么在重新启动后(或释放文件的稍微不那么激烈的东西)您应该能够git checkout -- previously-locked-file 并重新启动并运行。
  • 好吧,我仍然不确定到底发生了什么,但据我所知,VS 2010 正在锁定文件(奇怪,因为它是一个 .xml doc 文件)。 Process Explorer 没有发现任何锁定该文件的东西,但是在我退出 VS 后,我能够使用 git checkout 来取回文件(在 git status 中它已被删除),现在一切都恢复到了我之前的状态试图变基/壁球。也许我应该再试一次,尽管此时我感到有些不安。
  • 跟进,很多个月后:我再也没有遇到这个问题了。变基工作正常,甚至包括交互式变基。这一定是一时的 VS 文件锁定故障。
  • 关闭 Visual Studio 2010 也为我解决了这个问题
  • Atom 显然也会锁定文件。重启修复它。
【解决方案4】:

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

据我所知,IIS 是问题的一部分。如果我在需要修改大量文件的两个主要分支之间切换,git 将删除一个文件或目录(通常是 DLL),而 IIS 正试图用它做某事或其他事情。此时,IIS 进程会自动使用已锁定且似乎不属于任何人的版本覆盖磁盘上的文件。

此时停止 IIS 不会这样做。我发现最好的办法是重新启动,并记住在将来更改主要分支之前停止 IIS。

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

【讨论】:

  • 嗨,迈克...我们遇到了同样的问题,但它突然出现了。我们一直在运行 IIS 的许多项目上使用相同的过程,并且从未遇到过问题。然而,有一天,它开始发生……令人困惑和沮丧。写完这篇文章后你学到了什么?
  • 感谢 Mike 的洞察力 - 在我的情况下,检查一个旧分支与 ASP.NET MVC 项目的绑定 URL 与前一个分支不同,导致 Visual Studio 然后 IIS 锁定一些项目中的文件。在 IIS 中停止相应的应用程序池会解除锁定。
  • IIS 也是我的罪魁祸首;当这弹出一个快速的iisreset 似乎释放文件锁。
  • 我发现 OneDrive 也会发生同样的事情:在存储在 OneDrive 中的存储库中切换分支确实会混淆它
  • 我在win10上也遇到过这种情况,需要重启但我没有测试iisreset解决方案。
【解决方案5】:

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

【讨论】:

  • 就是这样,看起来像进程锁定什么的
  • 在 IntelliJ 中也有帮助
  • 重新打开 WebStorm 帮助了我
【解决方案6】:

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

【讨论】:

  • 很高兴知道,尽管就我而言,我没有使用 TortoiseGit;我只是使用命令行。
【解决方案7】:

我只是偶然发现了这个答案 - 这个错误是一个虚假的错误。# 错误:无法统计“reddit/app/views/links”:权限被拒绝

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

关闭编辑器后 - 我再次运行“git merge”并繁荣,它工作了。

多么无意义的错误:(

【讨论】:

  • 谢谢!并非每天您都会在列表中看到“正确”的答案。我建议将此标记为正确答案。与其中止当前操作,不如解决真正的问题。
【解决方案8】:

如果您使用的 IDE(如果您使用其中一个)也可能会妨碍您。这就是我在使用 QtCreator 时发生的事情。

【讨论】:

  • 我就是这种情况,使用 PhpStorm。重新启动它修复了错误。
【解决方案9】:

这在 Windows 中偶尔会发生在我身上

错误:无法统计“文件名”:权限被拒绝

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

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

【讨论】:

    【解决方案10】:

    如果您正在运行 webpack,请将其关闭。关闭你的IDE。完成这些事情后应该可以正常工作。

    【讨论】:

      【解决方案11】:

      当您使用 SublimeText 并且要求您购买程序的弹出窗口未关闭时,也会发生这种情况。

      【讨论】:

      • 通过打开项目/文件树也可以使用 Atom
      • 像@Hal 一样,我的问题是关于 Atom。这是因为一个分支中的文件夹不在另一个分支中。关闭 Atom 会修复它,但您也可以折叠项目树(以隐藏文件夹),这也可以。
      【解决方案12】:

      在 Win 10 中使用 SourceTree,通过关闭 Atom 编辑器解决了问题。

      错误重现:

      1. 在分支 B 中,创建一个 md 文件,使用 Atom 对其进行编辑、保存并提交。
      2. 切换到分支 A,从服务器拉下新的提交。
      3. 尝试切换回来,Opps,它说“错误:无法统计'文件':权限被拒绝”。

      【讨论】:

        【解决方案13】:

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

        解决此问题的最简单方法是关闭已打开项目文件的所有内容,合并您的分支,然后重新打开它们以刷新它。这也将避免程序不再知道发生的任何更改的任何问题,从而迫使您手动刷新项目。

        【讨论】:

        • 天啊!我在后台运行 elm-live。这让我头疼不已。
        【解决方案14】:

        在 Windows 上发生在我身上,同时在 IntelliJ 集成终端 中进行变基。 我注意到我有 Git bash 客户端实例并行运行。

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

        【讨论】:

          【解决方案15】:

          我遇到了类似的问题。但解决起来非常简单。 在 Windows 机器上,我的文件资源管理器打开了一个文件夹,该文件夹存在于一个分支中,但在我签出的另一个分支中不存在。 关闭文件资源管理器解决了这个问题。

          【讨论】:

            【解决方案16】:

            我刚刚在 Win 7 下有过这个。

            $ git stash pop 错误:无法统计“父文件夹/子文件夹”:权限被拒绝 错误:无法统计“父文件夹/子文件夹”:权限被拒绝

            诊断:

            1>我去了子文件夹,它在那里,我无法删除它!

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

            结果:原来是 XMLSpy 在那里打开了其中一个 xml,关闭 XML Spy 并再次尝试 stash pop,它现在正在工作。

            【讨论】:

              【解决方案17】:

              另一种解决方案,而不是像几乎所有其他答案所说的那样关闭所有可能锁定目录的应用程序,而是使用一个实用程序来解锁文件/目录而不关闭所有内容。 (我讨厌需要重新启动 Visual Studio)

              LockHunter 是我使用的那个:https://lockhunter.com/ 可能还有其他的,但是这个对我来说效果很好。

              【讨论】:

                【解决方案18】:

                尝试关闭 Sublime、VS Code、Webstorm 等 IDE 并关闭打开文件夹的程序(例如 CMD、Powershell、CMDer、Terminal 等)将解决此问题。

                【讨论】:

                • 我在 Visual Studio 2019 打开时收到此错误消息。关闭后,错误消失了。
                【解决方案19】:

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

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

                attrib -R /S
                

                这解除了对文件的锁定,之后一切正常,我可以使用 GitHub Windows 客户端同步我的更改。

                【讨论】:

                  【解决方案20】:

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

                  但是,即使在我关闭 Visual Studio 之后,我还必须做的一个额外步骤是在任务资源管理器中手动杀死 “devenv.exe” Visual Studio 进程. 完成此操作后,我能够再次在 gitbash 中运行:

                  git 拉

                  并且“无法统计 文件名”错误消失了。这可能是由于 Visual Studio 扩展使进程在关闭后仍保持打开更长时间。

                  【讨论】:

                    【解决方案21】:

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

                    【讨论】:

                      【解决方案22】:

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

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

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

                      【讨论】:

                        【解决方案23】:

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

                        然而,在这种情况下,由于它基本上是一种竞争条件,您所要做的就是继续您中断的变基过程。不幸的是,这一直发生在我身上,所以我写了这个 dangerous 小助手来保持我的变基:

                        #!/bin/sh
                        
                        set -e
                        
                        git checkout .
                        git clean -df
                        git rebase --continue
                        

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

                        【讨论】:

                          【解决方案24】:

                          在 Windows 中使用 Photoshop 时发生在我身上: 当我保存图像然后切换到分支时(在打开图像的情况下离开 Photoshop)我得到了 git 错误。在 Photoshop 中关闭图像并重试

                          【讨论】:

                            【解决方案25】:

                            如果您打开了Meld merge tool,请将其关闭。它会阻止文件覆盖。

                            【讨论】:

                              【解决方案26】:

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

                              【讨论】:

                                【解决方案27】:

                                就我而言,我有一个 webpack 开发服务器在后面运行。

                                【讨论】:

                                  【解决方案28】:

                                  当我的 VS1013 位于针对 8.1 的分支上并且我试图签出 8.0 分支时,我收到了这个错误。我需要回到 VS 并允许它更新所有。然后我可以无错误地签出 8.0 分支。

                                  【讨论】:

                                    【解决方案29】:

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

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

                                    第一个终端收到您在上面发布的错误,另一个终端之前从 yeoman 运行了grunt serve 终端命令(链接如下)。第二个终端需要保持打开状态才能托管本地服务器实例。

                                    关闭所有正在运行的终端窗口可能会导致错误消失。

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

                                    Grunt 服务命令 - Yeoman.I/O
                                    http://yeoman.io/learning/

                                    【讨论】:

                                      【解决方案30】:

                                      我刚刚遇到了这个问题。这里没有一个答案碰巧为我解决了这个问题。

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

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

                                      很奇怪。

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

                                      【讨论】:

                                        猜你喜欢
                                        • 2012-06-14
                                        • 2012-08-18
                                        • 1970-01-01
                                        • 2015-11-29
                                        • 2018-01-06
                                        • 2017-07-25
                                        • 2018-10-24
                                        • 2022-09-29
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多