git rebase:"错误:无法查看'文件名':权限被拒绝"

393
我正在使用git,并完成了一次小的提交,然后进行了大的提交。我决定在推送前使用git rebase将这两个提交合并。 (我以前从未这样做过。) 所以我做了以下操作: git rebase -i HEAD~2 这使我进入编辑器,在那里我选择选取较早的提交并压缩后面的提交。当我保存时,git会显示: 错误:无法访问 '文件名':权限被拒绝 无法应用sha1值为...的提交 现在: - 当我执行git log时,两个提交都没有出现。 - git status 告诉我“当前没有任何分支”。 - 一个文件被列为已修改并处于索引中,两个文件被列为未跟踪。我的第一个提交只有一个文件(我想),而我的第二个提交有十几个文件。 发生了什么事?如何解决?

12
你是否在Windows上使用Git? - CB Bailey
2
你正在运行病毒检查器吗?有时候质量较差的病毒检查程序会导致这样的问题。 - Greg Hewgill
55
我在使用git checkout时遇到了问题(因此无法像被接受的答案建议的那样中止操作),但关闭所有的IDE后,问题得以解决。第二个答案应该是被接受的答案。 - plus-
2
@IanGrainger,你提到的答案是在被接受的答案发布八个月后发布的。我需要每隔几个月访问所有问题并潜在地更改它们的被接受的答案吗?投票按钮存在是有原因的。如果最受欢迎的答案比被接受的答案更有帮助,那么请使用它。谁会阻止你呢?但我接受了我所接受的答案,因为它对我有帮助,而我是提出问题的人。 - Ryan Lundy
我见过的最愚蠢、无用、毫无意义的错误信息。 - garryp
显示剩余5条评论
36个回答

2

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

所以我以管理员身份打开了一个普通的dos窗口,切换到该目录,并执行了以下命令:

attrib -R /S

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


1

如果您打开了Meld合并工具,请关闭它。这会阻止文件被覆盖。


1
在我的情况下,我有一个运行在后台的webpack开发服务器。

1

我将 w3wp.exe 进程与该仓库相关的进程关闭后,问题得到了解决。


1

在我的电脑上,使用Git Bash版本2.9.0.windows1,操作系统为Windows 10 64位,我遇到了同样的问题。我使用Atom作为编辑器。

以下方法解决了我的问题:将Git软件文件夹(对我而言是C:\Program Files\Git)添加到Windows Defender的排除列表中。

添加排除后,git checkout 'file'命令可以正常工作。


1
这个错误也可能是由于之前的git操作导致文件仍然被“锁定”引起的。这与Windows文件系统层的工作方式有关。我曾经读过一个很好的解释,但我记不得在哪里看到了。
在这种情况下,由于基本上是竞争条件,您只需要继续您中断的rebase过程即可。不幸的是,这种情况经常发生在我身上,所以我写了这个小而危险的助手来保持我的rebase进行:
#!/bin/sh

set -e

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

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

1
当我在Windows上使用Photoshop时,遇到了这个问题: 当我保存一张图片并切换到另一个分支(离开打开图片的Photoshop)时,出现了Git错误。关闭Photoshop中的图片,然后重试。

0
在我的情况下,该文件是一个shell脚本(*.sh文件),旨在将我们的项目部署到本地开发服务器上,供我的开发人员使用。
该shell脚本应该始终可靠地运行,并且可能会更新;因此,我将其与脚本旨在部署的代码一起跟踪在同一个Git项目中。
该shell脚本运行一个可执行文件,然后允许该可执行文件运行;所以脚本仍在运行;因此我的shell仍然打开着该脚本;所以它被锁定了。
我使用Ctrl+C来终止该脚本(因此现在我的本地开发服务器不再可访问),现在我可以自由地检出。

0

当我的VS1013处于针对8.1的分支上,我尝试检出一个8.0分支时遇到了这个错误。我需要切换回VS并允许它更新所有内容。然后我就可以无误地检出8.0分支了。


0

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

然而,那个时候我有多个 Git 终端开启。

第一个终端收到了你上面提到的错误信息,而另一个终端之前已经运行过 yeoman 的 grunt serve 终端命令(链接如下所示)。第二个终端需要保持开启以承载本地服务器实例。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接