git checkout 错误: 无法创建目录:权限被拒绝。

36

我在使用git checkout命令时遇到了问题,请帮忙。

以下是我的操作步骤:

  1. 创建了一个本地目录,创建了一些文件,并在本地初始化了一个git仓库。
  2. 在Bitbucket上创建了一个仓库,并将本地仓库推送到了Bitbucket上。
  3. 在本地创建了一个名为b01的新分支。
  4. 向b01添加了新文件,提交并成功地将该分支推送到Bitbucket。
  5. 现在我正在尝试将b01与master合并,这就是我遇到问题的地方。我无法切换到master分支。

以下是我使用的命令列表和错误详情:

git clone [my repo]
git checkout -b b01

之后我进行了多次更改,包括创建新文件和目录,提交这些更改并成功地将这些更改推送到该分支的仓库中。例如:

git push -u origin b01

现在我已经完成了修改并希望将其合并到主分支。因此我执行:

git checkout master

这里是它抛出的错误:

fatal: cannot create directory at 'workfolder': Permission denied
Git让我留在b01分支,但是删除了我在该分支中创建的所有文件。因此,如果现在我执行

git status

它向我展示:

On branch b01
Your branch is upto date with 'orgin/b01'
Changes not staged for commit:
(use "git add/rm .....)
  deleted: new file1
  deleted: new file2
<list of the new files I had added but which got deleted as a result of the command>

我必须运行一个

git checkout -- . 

恢复文件。

请帮忙。


你以管理员权限运行了Git Bash吗?这听起来好像它没有创建文件夹的权限。其他问题可能是由此引起的副作用。 - Tim Biegeleisen
我正在使用一台Windows机器。我是这台机器上的管理员。@TimBiegeleisen - TechiRik
更新:我不知道出了什么问题,但是我打开了第二个git bash窗口,然后通过第二个窗口解决了问题。 我没有改变任何东西。 我仍然保持这个问题的开放状态,以看看是否有人能够理解我做错了什么。 - TechiRik
7个回答

73

我有过类似的情况。是因为我在 Visual Studio 中打开了解决方案。关闭 Visual Studio 并执行 Git 重置,让我回到了好的状态。

也就是说,请检查是否有任何进程锁定了文件夹/文件。


1
我同时打开了Visual Studio和VS Code。其中一个肯定在维护文件锁。一旦它们都关闭了,“git checkout foo-branch”对我有用了。 - Kevin Kuszyk
1
我同时打开了Visual Studio和VS Code,但只需要关闭VS Code,然后就可以通过Studio的TFS界面执行操作了。 - 333Matt
关闭VScode并执行git reset --hard对我也起了作用。但是要小心,大家! - Kenmore
在VSCode中,我打开了两个终端。其中一个用于运行与监视器通信的gulp任务,另一个终端则是为了“尝试”切换分支。我退出了两个终端,重新打开了一个新的终端,然后我才能切换。感谢指出这一点! - klewis
我在Visual Studio Code中打开了一个不同项目的工作区,但它仍然阻止了我的合并。在关闭所有Visual Studio Code实例后,问题得到了解决。 - sed lex
在我的情况下,VSCode也是罪魁祸首。 - Mohammad Faisal

8

正如已经说过的,这些问题可能会发生在另一个进程正在访问文件时,因此关闭任何可能正在使用它的应用程序将有所帮助。对我而言,Visual Code 已打开,关闭它确实有所帮助。


4

只需通过以下方式更改权限,允许一个或一组用户访问该“workedfolder”:

sudo chmod u+w <exact_workedfolder_permission_denied>

或者

sudo chown -R user_name:user_name <exact_workedfolder_permission_denied>

注意:请保留HTML标签。

给每个人赋予执行权限是一个非常糟糕的想法。这会导致安全漏洞广泛开放。 - Eric Aya
@EricAya,所以您可以使用另一个 sudo chmod u+w <workedfolder> 命令来允许一个或多个用户修复此权限被拒绝的问题。 - Arsène Jerry ANDRIANARIMANANA
如果您能编辑您的答案并添加正确的解决方案,以便不向所有人开放执行权限,那就太好了。 :) - Eric Aya

3

我知道这个问题有点老了,但是正如顶部答案建议使用--hard标志一样,这可能并不必要,所以我决定发表这篇文章。

可能的问题原因:其他进程正在使用/锁定您尝试删除的文件/文件夹

解决方案:停止此进程,然后重试。一种找到它的方法是通过资源监视器(我从这里学到的方法):

  1. 打开任务管理器
  2. 导航到性能选项卡
  3. 在底部单击打开资源监视器
  4. 导航到CPU选项卡
  5. 关联句柄部分,有一个搜索字段 - 输入您收到“权限被拒绝”错误的目录/文件路径
  6. (查看并)停止出现在搜索结果中的任何进程。

在我的情况下,奇怪的是VS Code成为了导致事情卡住的进程。我关闭了VS Code,并能够从PowerShell检出不同的分支。 - RayLoveless
5
由于有人对这个答案进行了负面评价,我想建议在评论区也写下错误之处,这样对社区的帮助更大... - tyrrr
令人烦恼的是,在Visual Studio 2019中似乎有两个devenv.exe的进程。关闭其中任何一个都会关闭Visual Studio :( - undefined

0
首先,在使用git的每个操作之间,我建议快速执行git status。我无法告诉你这个操作已经帮我避免了多少次头疼。
接下来,我会尝试解决一些问题并提供一些解决方案:
  1. 你说你创建了目录并对b01进行了许多更改,然后将其推送到源。查看此操作的提交 `git show`。你是否更改了“workfolder”的父目录的权限?这可能有所帮助

  2. 你在使用Windows吗?如果是,你的目录路径有多深?路径长度是否超过了Windows的最大值?参考资料在这里

  3. 如果以上方法都不起作用,你尝试从b01创建一个临时分支,然后合并“master”吗?这有时会找出问题的原因。

  4. 最后的无奈之举。你尝试将“b01”复制/粘贴到存储库外,回滚到“master”的匹配最后提交,然后将“b01”副本中的更改粘贴到“master”上吗?当一切都变得混乱且毫无头绪时,有时候通过倒退解决问题会更容易,以找出问题出在哪里,并学习未来要避免的错误。


  1. 我在Windows上,权限没有改变。(2) 路径长度目前为97个字符,包括空格。所以不应该有问题。(3) 我该怎么做?你是指从分支b01创建分支b01a,然后将b01a合并到主分支而不是将b01合并到主分支吗?(4) 我还没有尝试过这个。我认为这是一个手动的过程,只有在以上方法都不起作用时才会尝试。你有什么想法,我是怎么搞砸了事情呢?
- TechiRik

0

这个问题的答案可能非常简单。假设你想将你的分支与主分支合并,可以执行以下操作:

git checkout -b master-2 // from your current branch where all the changes are
git branch -D master
git branch -m master-2 master
git push origin master

准备好了!请记住,这是为了覆盖分支中的所有内容。


0
在我的情况下,我只是使用提交哈希而不是分支名称检出了有问题的提交。

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