【问题标题】:git checkout error: cannot create directory: Permission deniedgit checkout 错误:无法创建目录:权限被拒绝
【发布时间】:2017-01-31 17:14:26
【问题描述】:

我遇到了 git checkout 命令的问题。请帮忙。

这就是我所做的。

  1. 创建了一个本地目录。创建了一些文件。在本地启动了一个 git repo。
  2. 在 bitbucket 中创建了一个 repo 并将我的本地 repo 推送到 bitbucket
  3. 在本地创建了一个新分支,b01
  4. 将新文件添加到 b01,提交并成功将分支推送到 bitbucket
  5. 现在我正在尝试将 b01 与 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?这听起来好像它没有创建文件夹的权限。其他事情可能是这个的副作用。
  • 我使用的是 Windows 机器。我是机器上的管理员。 @TimBiegeleisen
  • 更新:我不知道出了什么问题,但我打开了第二个 git bash 窗口,它通过第二个窗口工作。我没有改变任何东西。我仍然保持这个问题的开放性,看看是否有人能理解我做了什么把事情搞砸了。

标签: github bitbucket git-checkout


【解决方案1】:

我也遇到过类似的情况。虽然这是因为我在 Visual Studio 中打开了解决方案。关闭 Visual Studio 并执行 git reset 让我处于一个好位置。

即检查是否有任何进程正在锁定文件夹/文件。

【讨论】:

  • 我打开了 Visual Studio 和 vs 代码。其中之一必须保持文件锁定。一旦他们都关闭了git checkout foo-branch为我工作。
  • 我也打开了studio和VScode,我只需要关闭VScode,之后就可以通过studio的TFS界面进行操作了。
  • 关闭 VScode 并执行 git reset --hard 也为我修复了它。但要小心,人们!
  • 在 VSCode 中,我打开了两个终端。一个用于运行与手表通信的 gulp 任务,另一个用于“尝试”切换分支的终端。我退出了两个终端,重新打开了一个新终端,然后我就可以切换了。感谢您指出这一点!
  • 我在不同项目的工作区打开了 Visual Studio 代码,但它仍然阻止了我的合并。在我关闭所有可视代码工作室实例后工作正常。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我知道这个问题有点老了,但正如最佳答案建议使用 --hard 标志,这可能没有必要,我决定发布这个。

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

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

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

    【讨论】:

    • 奇怪的是,在我的情况下,VS 代码是挂起事情的过程。我关闭了 vs 代码,并能够从 powershell 签出不同的分支
    • 由于有人对这个答案投了反对票,我只是想建议在评论部分也写下这里的错误是一件好事 - 这样对社区更有帮助......
    【解决方案4】:

    首先,在使用 git 的每个操作之间,我建议您快速使用git status。我无法告诉你这多少次让我省了很多麻烦。

    我可能会尝试对问题进行一些说明:

    1. 您说您创建了目录并对 b01 进行了大量更改,然后将其推送到源。查看此操作的提交 `git show 。您是否更改了“工作文件夹”父目录的权限? This might be of help.

    2. 您在 Windows 上吗?如果是,您的目录路径有多深?路径长度是否超过窗口最大值? Reference here.

    3. 如果这些都不起作用,您是否尝试过从 b01 创建一个一次性分支并合并“master”?这有时会找出原因。

    4. 丑陋的冰雹——玛丽。您是否尝试过在存储库外复制/粘贴“b01”,回滚到匹配的“master”最后一次提交,然后将“b01”副本中的更改粘贴到 master 上?当事情完全颠倒并且没有意义时,有时更容易通过问题回溯以找出问题所在并了解将来不应该做的事情。

    【讨论】:

    • 1.我在窗户上,没有改变烫发。 (2) 当前路径长度为 97 个字符,带空格。所以应该不是问题(3)我该怎么做?您的意思是在分支 b01 上创建分支 b01a,然后将 b01a 合并到 master 而不是 b01 到 master? (4) 没试过这个。我相信这是一个手动过程,只有在以上都不起作用的情况下才会尝试。知道我做错了什么把事情搞砸了吗?
    【解决方案5】:

    在我的例子中,我只是使用提交哈希而不是分支名称签出了有问题的提交。

    【讨论】:

      【解决方案6】:

      304/5000 答案可能很简单。假设您想将您的分支与 master 混合,您可以执行以下操作:

      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
      

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

      【讨论】:

        【解决方案7】:

        只需更改权限以允许此“工作文件夹”的一个或组用户通过此

        sudo chmod u+w &lt;exact_workedfolder_permission_denied&gt;

        或

        sudo chown -R user_name:user_name &lt;exact_workedfolder_permission_denied&gt;

        【讨论】:

        • 将执行权授予每个人是一个非常糟糕的主意。广泛公开的安全漏洞。
        • @EricAya,因此您可以使用另一个 sudo chmod u+w &lt;workedfolder&gt; 来允许一个或多个用户修复此权限被拒绝
        • 如果您能edit您的答案并添加适当的解决方案以不向所有人开放执行权,那就太好了。 :)
        猜你喜欢
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        相关资源
        最近更新 更多