Предупреждение 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

...и т.д. Их сотни.

Сначала я подумал, что это просто проблема с разрешениями, и поэтому я рекурсивно добавил разрешения на запись группы для всего каталога требований, но никаких изменений не произошло.

Изменить: как предлагается в ответе ниже, я попытался сделать то же самое, но со всем остальным закрытым. Мне повезло не больше, чем раньше.

Эта проблема особенно изнурительна, поскольку я не могу перейти в основной сервер, чтобы вернуться к нормальному развитию.

Идеал
источник
возможный дубликат ошибки Git push:
Этот бразильский парень
9
Я решил это с помощью простогоsudo chown -R username directory
Стивен Корвин

Ответы:

84

Я обычно вижу такую ​​ошибку, когда есть процесс, не освобождающий дескриптор этих файлов.

Убедитесь, что ничего не запущено, а затем попробуйте оформить заказ еще раз.

Примечание: это также может быть связано со способом установки Git (в Windows UAC может вызвать проблемы, если msysgit установлен в C:\Programили C:\Program Files, см. « Msysgit - sh.exe - fork: Permission denied - Vista 64 bit » и комментарий 2 к выпуск 437 )

Примечание: как показано ниже , другой распространенной причиной проблемы является проблема с правами в каталоге (неправильный владелец), не обязательно в файле, связь с которым невозможно разорвать.

VonC
источник
1
Я использую Ubuntu, чтобы прояснить это. И, к сожалению, я использую только этот веб-браузер и свою консоль, у которых одна вкладка открыта для соответствующего каталога (и две открыты совсем в другом месте).
Paragon
3
@Paragon: даже в unix вы можете решить проблемы. В противном случае это должна быть какая-то проблема с разрешением. Однако у вас должна быть возможность принудительно оформить заказ. git checkout -f master
VonC
2
+1 в моем случае это был общий доступ к папке с активной виртуальной машиной, которая запрещала отбрасывать файлы в git в хост-системе. Сдвинул меня с ума, так что спасибо за подсказку!
Jook
1
Та же проблема. Запуск Process Explorer> Ctrl + F> <filename> - отобразит процесс, который держит этот файл открытым.
сетевой
1
GitExtensions отображал эту ошибку при попытке получить все ... У меня также был открыт GitKraken. Как только я закрыл GitKraken, загрузка прошла без ошибок.
mkaj 02
99

Когда я впервые столкнулся с этой ошибкой, мой пользователь имел права «писать» в файл, но не в содержащий его каталог. Проверьте права доступа к каталогу, в котором находится файл.

Элайджа Линн
источник
95
Ой, слишком забавно, я только что наткнулся на этот ответ сегодня, а потом понял, что это мой собственный! Тем не менее, это снова сработало!
Элайджа Линн
Хорошо, это случилось со мной в Windows 10, я перехожу в основную папку проекта. и добавьте ДЛЯ ВСЕХ ВОЗМОЖНЫХ ПОЛЬЗОВАТЕЛЕЙ все разрешения. Итак, для системы, администратора, пользователей - все возможности. Примените изменения. И, похоже, это работает, возможно, с обновлением Windows 10, даже если мы не создаем нового пользователя, мы попадаем под угрозу, как новый, без разрешений. Например, у меня есть какое-то странное имя S-1-15-32 ..... Не то имя для входа, которое у меня есть, когда мы разблокируем наш ноутбук.
PsychedelicSubstance
30

«Отменить связь» в данном случае означает «удалить файл».

Эта ошибка не вызвана самим git. Аналогичные ошибки могут возникнуть при удалении этих файлов вручную, в командной строке или в проводнике.

rtconner
источник
18
Когда я впервые столкнулся с этой ошибкой, у моего пользователя были права на «запись» в файл, а в содержащую его директорию - нет.
Элайджа Линн
3
@ Элайджа: Спасибо! Вот что было для меня.
Джесси Ли
4
В моем случае я обнаружил, что файл, о котором идет речь, был заблокирован другим приложением. Закрытие приложения освободило файл и позволило продолжить оформление заказа.
Саймон Тевси 01
25

У вас нет разрешения на доступ, возможно потому, что вы не являетесь владельцем.

Исправьте, изменив владельца на себя:

sudo chown -R your_login_name /path/to/folder
Винс Юань
источник
2
На моей локальной машине разработки файлы, о которых идет речь, были первоначально созданы моим локальным сервером apache, поэтому принадлежали пользователю www-data. Как только я подключил их к своей учетной записи, все снова заработало нормально. «В разрешении отказано» было реальной проблемой. «Не могу не понравиться» было всего лишь отвлекающим маневром.
Дейл Андерсон,
23

У меня возникла проблема с файлом default-settings.php в drupal 7. В этом случае я не смог удалить его или вернуть обратно, как сказал @rtconner. У меня не было приложения или чего-либо, использующего этот файл, и это закончилось ошибкой разрешений.

Я добавил chmod 777 *в папку, а затем без проблем смог восстановить.

Роб Эрскин
источник
3
Хотя вам может не понадобиться ни 777одна папка. Это решило мою проблему, но я быстро вернул ее к умолчанию после того, как она была решена. Спасибо!
Bram
13

Для этого вы можете изменить права на запись.

sudo chmod -R ug+w . 

Эта команда предоставит 'w'разрешения всем папкам в текущем каталоге.

Раджендра Кумар Ванкадари
источник
6

Я сталкивался с этой проблемой всякий раз, когда запускал «git repack» или «git gc» на своих машинах с OS X, даже когда запускал git с правами администратора, и, наконец, решил ее, наткнувшись на эту страницу: http://hints.macworld.com /comment.php?mode=view&cid=1734

Чтобы исправить это, откройте терминал, перейдите в репозиторий git, cd в папку .git, а затем выполните:

chflags -R nouchg *

Если это была проблема, то после этого ваши команды git будут работать как обычно.

Изучите OpenGL ES
источник
1
Ссылка macworld больше не действительна. Вот обновленный исх .: superuser.com/a/40754
webb
5

Это также может произойти, когда:

  1. Вы запустили процесс внутри контейнера Docker и:

  2. Некоторые файлы были созданы этим процессом, и:

  3. Место назначения файлов монтируется как том на хосте Docker и:

  4. Вы работаете gitна хосте Docker.


Если это так, подготовьте файлы, которые хотите зафиксировать, и запустите:

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опцию, см. Это для Docker и это для Docker compose .

Davetapley
источник
4

Тем, кто использует Intellij , как сказал @rtconner, эта проблема не вызвана git. Поскольку ваша среда IDE заблокирована, файл (ы) git не может отсоединить его. Итак, вам нужно закрыть свою IDE, а затем попытаться объединить (или что вам нравится) через командную строку.

Хесам
источник
Вот и все. Произошло с Android Development, так как AndroidStudio - это Intellij.
Reinherd
2

В моем случае это был символ «:» в имени папки, препятствовавший проверке репозитория git в Windows.

simonC
источник
2

на терминале на Mac я просто делаю это

sudo git checkout. (чтобы все убрать)

а потом

sudo git pull origin

Jry
источник
2

У меня была эта ошибка внутри виртуальной машины (под управлением Ubuntu), когда я пытался это сделать git reset --hard.

Исправление заключалось в простом запуске git reset --hardс хост-машины OS X.

Хенрик Н
источник
1

Ни одно из других предложений не помогло мне, но это сработало:

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

0x1 каменщик
источник
1

В моем случае мой каталог Windows находится в папке Dropbox. Это не проблема, связанная с Git. Когда файл (в данном случае файл блокировки) только что был создан, Dropbox потребуется еще секунда для выполнения синхронизации. В это время файл используется Dropbox, и никакая сторонняя программа (в данном случае Git) не может удалить файл.

Мое решение - выйти из Dropbox и, следовательно, избежать закулисной магии синхронизации файлов Dropbox.

Винсент
источник
0

Я сталкивался с этой ошибкой , и это вызвано неправильным «владелец / группами» из файла / папки . Вы должны обратиться за помощью к администратору вашего сервера, чтобы изменить «владельца / группу» этого файла / папки и повторить попытку, используя «git pull» еще раз. Или, если вы sudoer, просто sudo chown «ваше имя владельца / имя вашей группы» и попробуйте еще раз получить свой репозиторий. Попробуйте, у меня работает на 100%!

Джефф Саймонс Десена
источник
0

Убедитесь, что все связанные процессы или потоки не запущены, и при необходимости выполните конечную задачу или принудительно завершите работу.

Убедитесь, что вы изменили право собственности.

Creative_Cimmons
источник
0

В общем, если это происходит в Windows , и вы используете tortoisegit , это кеш состояния tortoisegit . Убейте этот процесс, и он будет освобожден.

МудрыйКлубника
источник
Фактически вы можете полностью отключить кеш состояния TortoiseGit, и в целом я бы рекомендовал это. Это часто является причиной множества неожиданных блокировок файлов и, как правило, создает гораздо больше проблем, чем того стоит. Просто используйте git statusвместо этого из командной строки.
0

Мне просто нужно было переключить пользователя с ubuntu на мое настоящее имя пользователя, под которым я сначала делал что-то. Это исправило это.

Марк
источник
а что насчет пользователей windows?
Herr Nentu '27
ОП был на Ubuntu. Я бы не стал комментировать ветку Windows.
Marc
0

Решено для меня, установив мой клиент git (GitExtensions), чтобы он всегда работал в режиме администратора.

Frodo2975
источник
0

У меня была эта проблема при использовании IntelliJ(14.1.3 Ultimate), я хотел отменить изменения в каком-то файле.

Решено закрытием Git Bashоткрытого в другом окне - еще одна попытка отката IntelliJсработала.

Угорь Ли
источник
0

Я столкнулся с этой ошибкой, и я думаю, что проблема заключалась в том, что я «запускал от имени администратора», когда я запускал Eclipse и создавал файлы, поэтому они принадлежали администратору (это было замечено запуском ls -la в папке). Когда позже я попытался спрятать файлы, это не позволило мне («невозможно отключить файлы» и все такое). Для меня исправление было исправлением chmod для файлов.

LConrad
источник
0

Все, что вам нужно сделать, это предоставить разрешения, выполнить команду ниже из корня вашего проекта:

    chmod ug+w <directory path>
Ганза
источник
0

У меня была такая же проблема, я пробовал несколько альтернатив, как предлагали другие.

Но, наконец, предоставление правильного разрешения для папки .git решает проблемы.

sudo chown -R "${USER:-$(id -un)}" .git
Раза Рафаидин
источник
0

В моем случае проблема с разрешением решена установкой www-dataв качестве владельца:

chown -R www-data project_folder_name
Аваг Саргсян
источник
0

Думаю, дело в разрешении вашего файла:

sudo chmod 777 -R <your-git-folder>
Джонни Кейдж
источник