Помилка натискання Git: не вдається від’єднати стару (дозвіл відхилено)


192

На віддаленому сервері я встановив гак після отримання, щоб здійснити перевірку мого сховища:

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

Але коли я натискаю з локальної машини на сховище 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
Зміна дозволів режисура працювала для мене (спасибі!), Але це дивно, тому що я міг вручну перезаписати файли через sftp без проблем. Дивно, що коли git намагався зробити те саме, він не міг.
Джонатан Старк

1
Також пам’ятайте, що якщо файл все-таки відкриється, ця помилка також з’явиться. Була така ж помилка, і саме тому я не зміг підштовхнути свої зміни.
Matias

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


42

Якщо ви використовуєте будь-який IDE, швидше за все, проблема полягає в тому, що файл використовувався деяким процесом. Можливо, ваш файл tomcat використовує файл. Спробуйте визначити саме цей процес і закрити його. Це повинно вирішити вашу проблему.


13

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

git reset --hard

Видалено будь-які затяжні файли для очищення статусу git, а потім:

git pull

Це нарешті спрацювало.

ПРИМІТКА. Якщо папка, наприклад, була загальнодоступною папкою з файлами збірки, не забудьте відновити файли


Дякую, і для мене нічого іншого не працювало, видалення це здавалося єдиним варіантом.
math0ne

У моєму випадку ця кривдна папка - це .git
Tushar Kathuria

13

Я думаю, що проблема може бути у власності на папку, тому встановіть її на поточну власність користувача

sudo chown -R your_login_name /path/to/folder
Ви можете знайти рішення [тут] [1]

8

FWIW - У мене була подібна проблема, і я не впевнений, чи це полегшило її (поза модом дозволу): Закриття Eclipse, яка використовувала гілку з цією проблемою.


Так само я отримав цю помилку, коли в Excel був відкритий файл CSV, керований версією. Просто закриття Excel вирішило це. Це, мабуть, стосується й інших програм на Windows, і, ймовірно, залежить від того, наскільки програма позначає файл відкритим під час редагування.
Карел

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 add.

Приховані зміни.

git скринька

Скасувати локальні зміни.

git stash drop

Потягніть з дозволу судо

sudo git тягнути віддалену гілку


все стосується дозволу локальних файлів. Нічого спільного з git я не маю. Я просто запустив команду з sudo, і він спрацював, тому не вимагав усіх цих кроків
raviramani

Це було єдине, що мені працювало.
Ерік

2

Деякі файли захищені від запису, що навіть git не може над ними записати. Змініть дозвіл папки, щоб дозволити писати, наприклад, ім'я папки sudo chmod 775

А потім виконати

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.