Git push error: Невозможно отменить связь со старым (в доступе отказано)


193

На удаленном сервере у меня установлен хук post-receive, чтобы сделать git checkout моего репозитория:

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

Но когда я выполняю push с моего локального компьютера в git-репозиторий на сервере, я получаю следующие сообщения об ошибках:

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

Это появляется много раз, одно сообщение об ошибке почти для каждого файла.

Однако у меня есть файл README.txt, который я могу изменить с помощью git, вот его разрешения:

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

Но другие файлы с точно таким же владельцем и такими же правами дают мне эту ошибку.

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

Очевидно, это похоже на ошибку, связанную с разрешениями, но я не могу найти способ ее исправить, какие-либо предложения?

Ответы:


336

Когда вам нужно отсоединить файл, вы должны иметь разрешение 'w' для каталога, в котором находится файл, а не для файла ...


65
На самом деле это была проблема, я исправил ее, используя sudo chmod -R g+wпапки с ошибками.
rfc1484

1
OMG спасибо. Был так раздражен, думая, что права были правильными на файл. Имеет смысл, что обновления на самом деле больше похожи на mvдействия, чем просто перезаписывают.
DoubleJosh

1
Изменение разрешений dir сработало для меня (спасибо!), Но это странно, потому что я мог без проблем перезаписывать нужные файлы через sftp. Странно, что когда git попытался сделать то же самое, он не смог.
Джонатан Старк

1
Также имейте в виду, что если файл все еще открыт, эта ошибка также появится. Произошла та же ошибка, и именно поэтому я не смог толкнуть свои изменения.
Матиас

1
Первый символ ls -lдисплея указывает тип файла и не связан с разрешениями. Остальные девять символов находятся в трех наборах, каждый из которых представляет класс разрешений в виде трех символов. Первый набор представляет класс пользователя. Второй набор представляет класс группы. Третий набор представляет класс других. g+wВ CHMOD дает набор группы ( gпараметр) разрешение записи ( wпараметр)
rfc1484


42

Если вы используете любую IDE, скорее всего, проблема в том, что файл использовался каким-то процессом. Как ваш кот может использовать файл. Попробуйте определить этот конкретный процесс и закрыть его. Это должно решить вашу проблему.


13

У меня была та же самая проблема, и ни одно из вышеупомянутых решений не работало для меня. Я удалил оскорбительную папку. Затем:

git reset --hard

Удалил все устаревшие файлы, чтобы очистить состояние git, затем сделал:

git pull

Наконец-то это сработало.

ПРИМЕЧАНИЕ. Если папка была, например, общей папкой с файлами сборки, не забудьте перестроить файлы


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

В моем случае эта оскорбительная папка .git
Tushar Kathuria

13

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

sudo chown -R your_login_name /path/to/folder
Вы можете найти решение [здесь] [1]

8

FWIW - у меня была похожая проблема, и я не уверен, что это облегчило ее (за пределами мода разрешения): закрытие Eclipse, который использовал ветку с этой проблемой.


Точно так же я получил эту ошибку, когда CSV-файл с управлением версиями был открыт в Excel. Простое закрытие Excel решило это. Это, вероятно, верно и для других приложений на окнах и, вероятно, зависит от того, как программа помечает файл как открытый во время редактирования.
Карел

4

Это старый вопрос, но это может помочь пользователям Mac.

Если вы копируете файлы из Time Machine вручную, вместо того, чтобы восстанавливать их через Time Machine, он добавит списки ACL ко всему, что может испортить ваши разрешения.

Например, в разделе этой статьи, в котором говорится «Как исправить разрешения для файлов Mac OS X», показано, что «все» имеют настраиваемые разрешения, что все портит:

Неверные разрешения, с http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Вам необходимо удалить ACL из этих каталогов / файлов. Этот ответ суперпользователя входит в это, но вот команда:

sudo chmod -RN .

Затем вы можете убедиться, что ваши каталоги и файлы имеют соответствующие разрешения. Я использую 750для каталогов и 644для файлов.


3

Я получаю эту ошибку и другие странные ошибки git, когда у меня работает сервер (в Intellij). Остановка сервера и повторная попытка команды git часто исправляют это для меня.


3
git reset --hard

Работал для меня


4
Это может быть немного экстремальным, поскольку это делает намного больше.
cdaddr


2

Потянув, возможно, создал локальные изменения.

Добавьте свой неотслеживаемый файл:

мерзавец добавить.

Копить изменения.

заначка

Отбросьте локальные изменения.

Git Stash Drop

Потяните с разрешением sudo

sudo git pull удаленная ветка


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

Это была единственная вещь, чтобы работать для меня.
Эрик

2

Некоторые файлы защищены от записи, что даже Git не может перезаписать его. Измените разрешение папки, чтобы разрешить запись, например, sudo chmod 775 foldername

И затем выполнить

git pull 

очередной раз


1

Также не забудьте проверить разрешение самого корневого каталога!

Вы можете найти:

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

и появится сообщение об ошибке «Отказано в доступе».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.