Git Checkout警告:无法取消链接文件,权限被拒绝


109

我知道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

...等等。有数百个。

最初,我认为这只是一个权限问题,因此我将组写权限递归地添加到整个需求目录,但是没有任何变化。

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

这个问题特别令人沮丧,因为我无法转而转向正常状态。



9
我用一个简单的方法解决了问题sudo chown -R username directory
Stephen Corwin

Answers:


84

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

确保没有任何内容在运行,然后再次尝试结帐。

注意:它也可能与Git的安装方式有关(在Windows上,如果在C:\Program或中安装了msysgit,UAC可能会产生问题C:\Program Files,请参阅“ msysgit-sh.exe-fork:权限被拒绝-Vista 64位 ”和注释2问题437

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


1
我正在Ubuntu上进行清理。不幸的是,我只在此Web浏览器和控制台中使用,该控制台的一个选项卡打开了相关目录(另外两个则在其他位置打开)。
百丽宫

3
@Paragon:即使在Unix上,您也可能遇到句柄问题。否则,这应该是某种许可问题。您应该可以强制执行结帐。git checkout -f master
VonC

2
在我的情况下,+ 1是与活动VM共享的文件夹,禁止在主机系统上丢弃git中的文件。疯了我,所以谢谢你的提示!
Jook

1
同样的问题。运行进程浏览器> Ctrl + F> <文件名>-将显示进程,此进程将保持打开状态。
setevoy

1
尝试获取所有内容时,GitExtensions显示此错误...我也打开了GitKraken。一旦我关闭了GitKraken,所有的提取工作就没有错误了。
mkaj

99

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


94
噢,我太有趣了,我今天才遇到这个答案,然后我意识到那是我自己的!但是,它再次起作用了!
伊利亚·林恩2014年

好的,这发生在Windows 10上,我转到主项目文件夹。并为所有可能的用户添加所有权限。因此,对于系统,管理员,用户而言,一切皆有可能。应用程序。它似乎可以正常工作,也许可以通过Windows 10更新,即使我们不创建新用户,也会像没有权限的新用户一样受到威胁。例如,我有一个奇怪的名字S-1-15-32 ......当我们解锁笔记本电脑时,我没有登录名。
PsychedelicSubstance

30

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

此错误不是由git本身引起的。您应该在命令行或文件浏览器中手动删除这些文件时也遇到类似的错误。


18
在我第一次遇到此错误时,我的用户有权“写入”文件,但包含目录没有权限。
伊利亚·林恩

3
@以利亚:谢谢!那就是我的意思。
Jesse Lee

4
就我而言,我发现相关文件已被另一个应用程序锁定。关闭应用程序将释放文件并允许结帐继续。
西蒙·图西

25

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

通过将所有者更改为自己来解决:

sudo chown -R your_login_name /path/to/folder

2
在我的本地开发计算机上,有问题的文件最初是由我的本地apache服务器创建的,因此归www-data用户所有。一旦我把它们塞进我自己的帐户,一切都会恢复正常。真正的问题是“权限被拒绝”。“无法接受”只是一个红色的鲱鱼。
戴尔·安德森

23

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

我添加chmod 777 *到该文件夹​​,然后我就可以还原它了。


3
虽然您可能不需要777在任何文件夹上。这确实解决了我的问题,但是在解决之后,我很快将其更改回默认值。谢谢!
布拉姆


6

每当在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命令将正常运行。


1
macworld链接不再有效。这是更新的参考:superuser.com/a/40754
webb

4

对于使用Intellij的用户,如@rtconner所说,此问题不是由git引起的。由于您的IDE已锁定,因此文件git无法取消链接。因此,您需要关闭IDE,然后尝试通过命令行进行合并(或任何您喜欢的操作)。


就是这样 由于AndroidStudio是Intellij,因此发生了Android开发。
2013年

4

在以下情况下也会发生这种情况:

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

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

  3. 文件的目标作为卷安装在Docker主机上,并且:

  4. 您正在gitDocker主机上运行。


在这种情况下,暂存要提交并运行的文件:

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选项,请参阅DockerDocker compose


2

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


2

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

sudo git结帐。(清理一切)

然后

须藤git pull origin


2

尝试执行此操作时,我在虚拟机(运行Ubuntu)中出现此错误git reset --hard

该修补程序只是git reset --hard从OS X主机运行而已。


1

没有其他建议对我有用,但这确实做到了:

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


1

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

我的解决方案是退出Dropbox,因此避免了Dropbox文件同步的幕后魔术。


0

我遇到了此错误,它是由文件/文件夹的错误“所有者/组”引起的。您必须寻求服务器管理员的帮助才能更改此文件/文件夹的“所有者/组”,然后再次使用“ git pull”重试。或者,如果您是sudoer,则只需sudo chown“您的所有者名称/您的组名称”,然后再次尝试拉出您的存储库。试试吧,它对我有效100%!


0

确保任何关联的进程或线程未在运行,并根据需要执行最终任务或强制退出。

确保更改所有权权限。


0

就在一般情况下,如果这种情况发生在的Windows,并且您正在使用tortoisegit,它的地位缓存tortoisegit。杀死该进程,它将被释放。


实际上,您可以完全禁用TortoiseGit的状态缓存,通常我会建议这样做。这通常是导致大量意外文件锁定的原因,并且它所带来的麻烦往往要多得多。只需git status从命令行使用即可。

0

我只需要将用户从ubuntu切换到我首先要使用的用户名即可。这样就解决了。


Windows用户呢?
Nentu先生'15年

OP在Ubuntu上。我不会在Windows线程上发表评论。
2015年

0

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


0

使用IntelliJ(14.1.3 Ultimate)时遇到了问题,我想还原某些文件中的更改。

通过关闭Git Bash在另一个窗口中打开来解决-另一个恢复IntelliJ工作的工作。


0

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



0

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

    chmod ug+w <directory path>

0

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

但最后给.git文件夹正确的权限可以解决此问题。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.