【问题标题】:Git push error: Unable to unlink old (Permission denied)Git推送错误:无法取消链接旧(权限被拒绝)
【发布时间】:2019-03-01 00:04:04
【问题描述】:

在远程服务器中,我设置了一个接收后挂钩,以便对我的存储库进行 git checkout:

#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f

但是当我从本地机器推送到服务器中的 git 存储库时,我收到以下错误消息:

remote: error: unable to unlink old '<file>' (Permission denied)

这出现了很多次,几乎每个文件都有一条错误消息。

但是我有一个可以使用 git 更改的 README.txt 文件,这里是它的权限:

-rw-r--r--  1 <serverusername>  <serverusername>  2939 Aug  2 10:58 README.txt

但是其他拥有完全相同的所有者和相同权限的文件,给我这个错误。

在另一个网站的另一个本地存储库中,我以我的本地计算机用户名作为所有者的文件,当我推送到远程服务器时,它尊重文件的远程服务器所有者并且像一个魅力一样工作。

显然这似乎是与权限相关的错误,但我找不到修复它的方法,有什么建议吗?

【问题讨论】:

    标签: git git-push git-checkout


    【解决方案1】:

    当您必须取消链接文件时,您必须对目录具有权限'w',文件所在的目录,而不是文件...

    【讨论】:

    • 确实是问题所在,我在有罪文件夹上使用sudo chmod -R g+w 修复了它。
    • 天哪,谢谢。认为文件上的权限是正确的,非常恼火。有意义的是,更新实际上更像mv 操作,而不仅仅是覆盖。
    • 更改目录权限确实对我有用(谢谢!)但这很奇怪,因为我可以通过 sftp 手动覆盖有问题的文件而没有任何麻烦。奇怪的是,当 git 尝试做同样的事情时它却做不到。
    • 另外请记住,如果您仍然打开文件,也会出现此错误。有同样的错误,这就是为什么我无法推送我的更改。
    • ls -l显示的第一个字符表示文件类型,与权限无关。其余九个字符分为三组,每组以三个字符表示一类权限。第一组代表用户类别。第二组代表组类。第三组代表其他类。 chmod 中的g+w 赋予组集(g 参数)写入权限(w 参数)
    【解决方案2】:
    sudo chmod -R ug+w .;
    

    此命令将解决此问题。它授予文件夹写入权限。

    【讨论】:

      【解决方案3】:

      如果您使用的是任何 IDE,问题很可能是某个进程使用了​​该文件。就像您的 tomcat 可能正在使用该文件一样。尝试识别该特定进程并关闭它。那应该可以解决您的问题。

      【讨论】:

        【解决方案4】:

        我认为问题可能与文件夹的所有权有关,因此请将其设置为当前用户所有权

        sudo chown -R your_login_name /path/to/folder
        
        您可以在 [此处][1] 找到解决方案

        【讨论】:

          【解决方案5】:
          sudo chown -R $USER:$USER .
          

          为我完成了这项工作。

          【讨论】:

            【解决方案6】:

            我遇到了同样的问题,上面的解决方案都不适合我。我删除了有问题的文件夹。然后:

            git reset --hard
            

            删除所有延迟文件以清理 git 状态,然后这样做:

            git pull
            

            终于成功了。

            注意:例如,如果该文件夹是包含构建文件的公用文件夹,请记住重新构建文件

            【讨论】:

            • 谢谢,我也没有其他工作,删除它似乎是唯一的选择。
            • 在我的例子中,有问题的文件夹是 .git
            • 你疯了吗?按照你的建议,我完全失去了我目前的工作。这对我来说太疯狂了。完全是个坏主意。
            【解决方案7】:

            FWIW - 我有一个类似的问题,我不确定这是否能缓解它(超出权限模式):关闭正在使用该问题的分支的 Eclipse。

            【讨论】:

            • 类似地,当在 Excel 中打开版本控制的 CSV 文件时,我也遇到了这个错误。只需关闭 Excel 即可解决。这可能也适用于 Windows 上的其他应用程序,并且可能取决于程序在编辑期间如何将文件标记为打开。
            【解决方案8】:

            这是一个老问题,但这可能对 Mac 用户有所帮助。

            如果您从 Time Machine 手动复制文件,而不是通过 Time Machine 恢复文件,它会将ACLs 添加到所有内容中,这会破坏您的权限。

            例如,this article 中的“如何修复 Mac OS X 文件权限”部分显示“每个人”都有自定义权限,这就搞砸了:

            您需要从这些目录/文件中删除 ACL。 This Super User answer 进入其中,但命令如下:

            sudo chmod -RN .

            然后您可以确保您的目录和文件具有适当的权限。我对目录使用750,对文件使用644

            【讨论】:

            • 很好的答案。手动复制文件时,我正在寻找 mac ACL 问题。
            • macOS 中除了文件权限和 ACL 之外,还有锁。从 USB 闪存驱动器复制文件时,可能会碰巧应用锁定。它们可以使用chflags -R nouchg /path/ 递归解锁,如superuser.com/a/40754/199930 所述,并使用find . -type f -flags +uchg 找到,如coderwall.com/p/-3hwvg/find-locked-files-in-osx-terminal 所述
            • 谢谢! Ioannis 和 kylesimmonds 的答案是解决方法
            【解决方案9】:
            git reset --hard
            

            为我工作

            【讨论】:

            • 这可能有点极端,因为它做了更多的事情。
            【解决方案10】:

            当我运行服务器时(在 Intellij 中),我收到此错误和其他奇怪的 git 错误。停止服务器并经常重试 git 命令会为我修复它。

            【讨论】:

              【解决方案11】:

              有些文件是写保护的,即使是 git 也不能​​覆盖它。更改文件夹权限以允许写入,例如sudo chmod 775 文件夹名称

              然后执行

              git pull 
              

              再次

              【讨论】:

                【解决方案12】:

                检查文件夹的权限后,744 没问题。我的 WordPress 网站上安装的 插件 有问题。该插件已经挂钩了我怀疑的玉米工作。

                用一个简单的sudo it can fix the issue

                sudo git pull origin master
                

                你有它的工作。

                【讨论】:

                  【解决方案13】:

                  还要记得检查根目录本身的权限!

                  你可能会发现:

                  drwxr-xr-x  9 not-you www-data  4096 Aug  8 16:36 ./
                  -rw-r--r--  1     you www-data  3012 Aug  8 16:36 README.txt
                  -rw-r--r--  1     you www-data  3012 Aug  8 16:36 UPDATE.txt
                  

                  会弹出“权限被拒绝”错误。

                  【讨论】:

                    【解决方案14】:

                    拉动可能会产生局部变化。

                    添加您未跟踪的文件:

                    git 添加。

                    存储更改。

                    git 存储

                    删除本地更改。

                    git stash 删除

                    使用 sudo 权限拉取

                    sudo git pull 远程分支

                    【讨论】:

                    • 这都是关于本地文件的权限与 git 无关我只是用 sudo 运行命令并且它有效,所以不需要所有这些步骤
                    【解决方案15】:

                    我带着礼物来了

                    sudo chown -R $USER:$USER 
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-11-18
                      • 2018-10-24
                      • 1970-01-01
                      • 2013-01-17
                      • 1970-01-01
                      • 2011-11-04
                      • 2018-01-06
                      • 1970-01-01
                      相关资源
                      最近更新 更多