【问题标题】:Git Checkout warning: unable to unlink files, permission deniedGit Checkout 警告:无法取消链接文件,权限被拒绝
【发布时间】:2011-11-04 04:43:57
【问题描述】:

我知道 git 存在与“无法取消链接”警告相关的类似问题,但我无法使用它们。

主要区别在于,当我没有以任何方式处理子模块时(我以前从未处理过它们),就会发生这种情况。我创建了一个名为“升级”的分支,删除了我的旧框架文件,并复制了新的。我使用了 git add -A,然后提交了所有内容。当我尝试检查主干分支时,它响应以下错误:

warning: unable to unlink requirements/views/sk/index.php: Permission denied
warning: unable to unlink requirements/views/sv/index.php: Permission denied
warning: unable to unlink requirements/views/zh/index.php: Permission denied
warning: unable to unlink requirements/views/zh_cn/index.php: Permission denied
warning: unable to unlink requirements/views/zh_tw/index.php: Permission denied

...等等。有数百个。

一开始我以为这只是权限问题,于是递归地给整个需求目录添加了组写权限,但是没有任何改变。

编辑:正如下面的答案中所建议的,我尝试做同样的事情,但其他一切都关闭了。我没有比以前更多的运气了。

这个问题特别令人沮丧,因为我无法移动到主干以恢复正常发育。

【问题讨论】:

标签: git


【解决方案1】:

当有一个进程没有释放这些文件的句柄时,我通常会看到这种错误。

确保没有运行,然后再次尝试结帐。

注意:也可能与安装Git的方式有关(在Windows上,如果msysgit安装在C:\ProgramC:\Program Files,UAC会产生问题,见“msysgit - sh.exe - fork: Permission denied - Vista 64 bit”和comment 2 of issue 437

注意:作为illustrated below,问题的另一个常见原因是目录的权限问题(错误的所有者),不一定是无法取消链接的文件。

【讨论】:

  • 我在 Ubuntu 上,以澄清这一点。不幸的是,我只在这个网络浏览器和我的控制台中,其中有一个选项卡打开到相关目录(还有两个在其他地方打开)。
  • @Paragon:即使在 unix 上,您也可以处理问题。否则,这应该是某种许可问题。不过,您应该能够强制结帐。 git checkout -f master
  • +1 在我的情况下,它是与活动 VM 共享的文件夹,它禁止丢弃主机系统上 git 中的文件。把我逼疯了,谢谢你的提示!
  • 同样的问题。运行 Process Explorer > Ctrl+F > - 将显示进程,使该文件保持打开状态。
  • GitExtensions 在尝试获取所有内容时显示此错误...我还打开了 GitKraken。一旦我关闭 GitKraken,所有的提取工作都没有错误。
【解决方案2】:

在这种情况下,“取消链接”本质上是指“删除文件”。

这个错误不是git本身造成的。您应该在命令行或文件资源管理器中手动删除这些文件时遇到类似的错误。

【讨论】:

  • 在我第一次遇到此错误时,我的用户有权“写入”文件,但包含的目录没有。
  • @Elijah:谢谢!对我来说就是这样。
  • 就我而言,我发现有问题的文件已被另一个应用程序锁定。关闭应用程序会释放文件并允许结帐继续进行。
【解决方案3】:

我在 drupal 7 中遇到了 default-settings.php 文件的问题。在这种情况下,我无法像@rtconner 所说的那样删除或恢复它。我没有使用此文件的应用程序或任何东西,最终导致权限错误。

我在文件夹中添加了chmod 777 *,然后我可以恢复它没有问题。

【讨论】:

  • 虽然您可能不希望在任何文件夹上使用 777。这确实解决了我的问题,但在解决后我很快将其改回默认值。谢谢!
【解决方案4】:

在我第一次遇到此错误时,我的用户有权“写入”文件,但无权“写入”包含目录。检查包含该文件的目录的权限。

【讨论】:

  • 天哪,太有趣了,我今天才看到这个答案,然后我意识到这是我自己的!尽管如此,它再次起作用了!
  • 好的,它在 Windows 10 上发生在我身上,我转到主项目文件夹。并为所有可能的用户添加所有权限。所以对于系统、管理员、用户,所有的可能性。应用更改。而且它似乎可以工作,不知何故,也许是 Windows 10 更新,即使我们不创建新用户,我们也会像新用户一样受到威胁,没有权限。例如,我有一些网络名称 S-1-15-32..... 不是我解锁笔记本电脑时的登录名​​。
【解决方案5】:

对于那些使用 Intellij 的人,正如@rtconner 所说,这个问题不是由 git 引起的。由于您的 IDE 被锁定,因此 git 无法取消链接它。因此,您需要关闭 IDE,然后尝试通过命令行合并(或任何您喜欢的)它。

【讨论】:

  • 就是这样。发生在 Android 开发中,因为 AndroidStudio 是 Intellij。
【解决方案6】:

在我的情况下,它是文件夹名称中的“:”字符,防止 git repo 在 Windows 上结帐。

【讨论】:

    【解决方案7】:

    我遇到了这个错误,它是由文件/文件夹的错误“所有者/组”引起的。您必须寻求服务器管理员的帮助以更改此文件/文件夹的“所有者/组”并再次使用“git pull”重试。或者,如果您是 sudoer,只需 sudo chown "your owner name / your group name" 并再次尝试拉取您的存储库。试试吧,它对我来说 100% 有效!

    【讨论】:

      【解决方案8】:

      您没有访问权限,可能是因为您不是所有者。

      通过将所有者更改为您自己来修复:

      sudo chown -R your_login_name /path/to/folder
      

      【讨论】:

      • 在我的本地开发机器上,有问题的文件最初是由我的本地 apache 服务器创建的,因此归 www-data 用户所有。一旦我将它们添加到我自己的帐户中,一切都会再次正常运行。 “权限被拒绝”是真正的问题。 “无法取消”只是一条红鲱鱼。
      【解决方案9】:

      确保任何关联的进程或线程没有运行,并根据需要执行结束任务或强制退出。

      确保您更改了所有权权限。

      【讨论】:

        【解决方案10】:

        一般来说,如果在 Windows 中发生这种情况,并且您使用的是 tortoisegit,则它是 tortoisegit 的状态缓存。杀死该进程,它将被释放。

        【讨论】:

        • 您实际上可以完全禁用 TortoiseGit 的状态缓存,这通常是我推荐的。这通常是许多意外文件锁定的原因,而且它往往比它更值得的麻烦。只需在命令行中使用git status
        【解决方案11】:

        我在我的 OS X 机器上运行“git repack”或“git gc”时遇到了这个问题,即使是在以管理员权限运行 git 时,我在看到这个页面后终于解决了这个问题:http://hints.macworld.com/comment.php?mode=view&cid=1734

        修复方法是打开一个终端,进入你的 git repo,cd 到 .git 文件夹,然后执行:

        chflags -R nouchg *
        

        如果这是问题所在,那么之后,您的 git 命令将正常运行。

        【讨论】:

        【解决方案12】:

        我只需要将用户从 ubuntu 切换到我第一次使用的实际用户名。这样就解决了。

        【讨论】:

        • windows 用户呢?
        • OP 在 Ubuntu 上。我不会评论 Windows 线程。
        【解决方案13】:

        通过将我的 git 客户端 (GitExtensions) 设置为始终以管理员模式运行解决了问题。

        【讨论】:

          【解决方案14】:

          我在使用 IntelliJ (14.1.3 Ultimate) 时遇到了这个问题,我想恢复某些文件中的更改。

          通过关闭在另一个窗口中打开的Git Bash 解决了 - 在IntelliJ 中的另一个还原试验有效。

          【讨论】:

            【解决方案15】:

            您可以更改写入权限以完成它。

            sudo chmod -R ug+w . 
            

            此命令将授予'w' 对当前目录中所有文件夹的权限。

            【讨论】:

              【解决方案16】:

              在 Mac 上的终端上我只是这样做

              sudo git checkout 。 (清理一切)

              然后

              sudo git pull origin

              【讨论】:

                【解决方案17】:

                这也可能发生在:

                1. 在 Docker 容器内运行了一个进程,并且:

                2. 该进程生成了一些文件,并且:

                3. 文件的目的地作为卷挂载在 Docker 主机上,并且:

                4. 您正在 Docker 主机上运行 git


                如果是这种情况,暂存您希望提交并运行的文件:

                git diff --name-only --cached | xargs ls -l 
                

                满足上述条件的文件将带有前缀:

                -rw-r--r-- 1 root root ...
                

                它们归root 所有,不可写,这不好。 要修复该运行:

                 git diff --name-only --cached | xargs -i sh -c 'sudo chown $USER:$USER {}; chmod +w {}'
                

                更简洁的解决方案可能是使用--user 选项,请参阅this for Dockerthis for Docker compose

                【讨论】:

                  【解决方案18】:

                  当我尝试执行 git reset --hard 时,我在虚拟机(运行 Ubuntu)中遇到此错误。

                  解决方法只是从 OS X 主机运行 git reset --hard

                  【讨论】:

                    【解决方案19】:

                    没有其他建议对我有用,但这确实有效:

                    sudo git reflog expire --expire=now --all && sudo git gc --prune=now --aggressive

                    【讨论】:

                      【解决方案20】:

                      我遇到了这个错误,我认为问题是我在启动 Eclipse 并创建文件时“以管理员身份运行”,因此它们归管理员所有(通过在文件夹上运行“ls -la”来注意到)。当我后来尝试存储文件时,它并没有让我(“无法取消链接文件”等等)。对文件进行 chmod 对我来说是解决方法。

                      【讨论】:

                        【解决方案21】:

                        git gc 为我工作(在新标签中)。每次变基都会得到这个。谢谢http://www.saintsatplay.com/blog/2016/02/dealing-with-git-unlink-file-errors#.W4WWNZMzZZJ

                        【讨论】:

                          【解决方案22】:

                          您需要做的就是提供权限,从项目的根目录运行以下命令:

                              chmod ug+w <directory path>
                          

                          【讨论】:

                            【解决方案23】:

                            我遇到了同样的问题,我尝试了其他人建议的几种替代方法。

                            但最终给予 .git 文件夹正确的权限解决了问题。

                            sudo chown -R "${USER:-$(id -un)}" .git
                            

                            【讨论】:

                              【解决方案24】:

                              在我的情况下,通过将www-data 设置为所有者解决了权限问题:

                              chown -R www-data project_folder_name
                              

                              【讨论】:

                                【解决方案25】:

                                就我而言,我的 Windows 目录位于 Dropbox 文件夹下。这不是特定于 Git 的问题。当一个文件(在本例中为锁定文件)刚刚创建时,Dropbox 需要再花一秒钟的时间来进行同步。在此期间,Dropbox 正在使用该文件,任何第三方程序(在本例中为 Git)都无法删除该文件。

                                我的解决方案是退出 Dropbox,从而避免 Dropbox 文件同步的幕后魔力。

                                【讨论】:

                                  【解决方案26】:

                                  我在 Windows 机器上运行 Git Bash 时遇到了这个错误。在我的特殊情况下,我只需要以管理员身份打开 Git Bash。

                                  【讨论】:

                                    【解决方案27】:

                                    对我来说,消息的顶部有:

                                    Auto packing the repository in background for optimum performance.
                                    See "git help gc" for manual housekeeping.
                                    error: The last gc run reported the following. Please correct the root cause
                                    and remove .git/gc.log.
                                    Automatic cleanup will not be performed until the file is removed.
                                    

                                    所以我用rm .git/gc.log删除了文件,然后我得到了:

                                    Auto packing the repository in background for optimum performance.
                                    See "git help gc" for manual housekeeping.
                                    error: The last gc run reported the following. Please correct the root cause
                                    and remove .git/gc.log.
                                    Automatic cleanup will not be performed until the file is removed.
                                    
                                    warning: There are too many unreachable loose objects; run 'git prune' to remove them.
                                    

                                    运行git prune后,一切恢复正常。

                                    【讨论】:

                                      【解决方案28】:

                                      我解决了这个问题,只需删除所有临时数据 > 运行>%temp% >按 Enter 并删除所有临时文件并重新启动计算机。对我来说,它现在正在工作。

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 2019-06-26
                                        • 1970-01-01
                                        • 2019-03-01
                                        • 2012-06-14
                                        • 2021-09-18
                                        • 2012-11-15
                                        • 2017-12-23
                                        相关资源
                                        最近更新 更多