Błąd wypychania Git: Nie można odłączyć starego (odmowa uprawnień)

192

Na zdalnym serwerze mam skonfigurowany hak po otrzymaniu, aby dokonać wypłaty z mojego repozytorium:

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

Ale kiedy wypycham z mojego komputera lokalnego do repozytorium git na serwerze, otrzymuję następujące komunikaty o błędach:

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

To pojawia się wiele razy, jeden komunikat o błędzie dla prawie każdego pliku.

Mam jednak plik README.txt, który mogę zmienić za pomocą git, oto jego uprawnienia:

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

Ale inne pliki z dokładnie tym samym właścicielem i tymi samymi uprawnieniami dają mi ten błąd.

W innym lokalnym repozytorium dla innej witryny mam pliki z moją nazwą użytkownika lokalnego komputera jako właściciela, a kiedy przesyłam na serwer zdalny, szanuje właściciela plików na tym serwerze i działa jak urok.

Oczywiście wydaje się, że to błąd związany z uprawnieniami, ale nie mogę znaleźć sposobu, aby to naprawić, jakieś sugestie?

rfc1484
źródło

Odpowiedzi:

336

Kiedy musisz rozłączyć plik, musisz mieć uprawnienie „w” do katalogu, w którym znajduje się plik, a nie do pliku ...

Jan Marek
źródło
65
Rzeczywiście to był problem, naprawiłem to za pomocą sudo chmod -R g+wwinnych folderów.
rfc1484,
1
OMG dzięki. Byłem tak zirytowany, że uprawnienia do pliku były poprawne. Wydaje się sensowne, że aktualizacje bardziej przypominają mvakcje niż tylko nadpisywanie.
doublejosh
1
Zmiana uprawnień katalogu działała dla mnie (dzięki!), Ale jest to dziwne, ponieważ bez problemu mogłem ręcznie zastąpić te pliki za pomocą sftp. Dziwne, że kiedy git próbował zrobić to samo, nie mógł.
Jonathan Stark
1
Należy również pamiętać, że jeśli nadal masz otwarty plik, ten błąd również się pojawi. Miałem ten sam błąd i dlatego nie byłem w stanie wprowadzić zmian.
Matias
1
Pierwszy znak ls -lwyświetlacza wskazuje typ pliku i nie jest związany z uprawnieniami. Pozostałe dziewięć znaków jest w trzech zestawach, z których każdy reprezentuje klasę uprawnień jako trzy znaki. Pierwszy zestaw reprezentuje klasę użytkownika. Drugi zestaw reprezentuje klasę grupy. Trzeci zestaw reprezentuje klasę pozostałych. W g+wchmod daje grupie zestaw ( gparametr) uprawnienia do zapisu ( wparametr)
rfc1484
68
sudo chmod -R ug+w .;

To polecenie rozwiązałoby problem. Daje uprawnienia do zapisu do folderu.

Rajendra kumar Vankadari
źródło
42

Jeśli używasz dowolnego IDE, najprawdopodobniej problem polega na tym, że plik był używany przez jakiś proces. Tak jak twój kocur może używać pliku. Spróbuj zidentyfikować ten konkretny proces i go zamknąć. To powinno rozwiązać twój problem.

Rama Krishna Gollapudi
źródło
13

Miałem ten sam problem i żadne z powyższych rozwiązań nie działało dla mnie. Usunąłem niepoprawny folder. Następnie:

git reset --hard

Usunął wszystkie pliki trwałe, aby wyczyścić status git, a następnie:

git pull

W końcu zadziałało.

UWAGA: Jeśli folder był na przykład folderem publicznym z plikami kompilacji, pamiętaj, aby odbudować pliki

wcyn
źródło
Dzięki, nic więcej też dla mnie nie działało, usunięcie było chyba jedyną opcją.
math0ne
W moim przypadku tym folderem obrażającym jest .git
Tushar Kathuria,
13

Myślę, że problem może dotyczyć własności folderu, więc ustaw go na obecną własność użytkownika

sudo chown -R your_login_name /path/to/folder
Możesz znaleźć rozwiązanie [tutaj] [1]
Soumitra Sarkar
źródło
8

FWIW - Miałem podobny problem i nie jestem pewien, czy to go złagodziło (poza modem uprawnień): Zamykanie Eclipse, które korzystało z gałęzi z tym problemem.

cellepo
źródło
Podobnie dostałem ten błąd, gdy plik CSV o kontrolowanej wersji był otwarty w programie Excel. Samo zamknięcie programu Excel rozwiązało to. Prawdopodobnie dotyczy to również innych aplikacji w systemie Windows i prawdopodobnie zależy od tego, jak program oznaczy plik jako otwarty podczas edycji.
Carel
4

To stare pytanie, ale może pomóc użytkownikom komputerów Mac.

Jeśli kopiujesz pliki z Time Machine ręcznie, zamiast przywracać je za pomocą Time Machine, doda ACL do wszystkiego, co może zepsuć twoje uprawnienia.

Na przykład sekcja tego artykułu zatytułowana „Jak naprawić uprawnienia do plików systemu Mac OS X” pokazuje, że „wszyscy” mają niestandardowe uprawnienia, co wszystko popsuło:

Złe uprawnienia, od http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Musisz usunąć listy ACL z tych katalogów / plików. Oto odpowiedź Superużytkownika, ale oto polecenie:

sudo chmod -RN .

Następnie możesz upewnić się, że twoje katalogi i pliki mają odpowiednie uprawnienia. Używam 750do katalogów i 644plików.

kylesimmonds
źródło
3

Otrzymuję ten błąd i inne dziwne błędy git, gdy mam uruchomiony serwer (w Intellij). Zatrzymanie serwera i ponowna próba polecenia git często mnie naprawia.

Phil Carter
źródło
3
git reset --hard

Pracował dla mnie

kreker
źródło
4
To może być nieco ekstremalne, ponieważ robi o wiele więcej.
cdaddr
3
sudo chown -R $USER:$USER .

Wykonałam pracę dla mnie.

BARJ
źródło
2

Ciągnięcie mogło spowodować lokalną zmianę.

Dodaj swój nieśledzony plik:

git add.

Zmiany w skrytce.

git skrytka

Porzuć lokalne zmiany.

Git Stash Drop

Pociągnij za pozwoleniem sudo

sudo git pull zdalna gałąź

użytkownik2858738
źródło
chodzi o pozwolenie na lokalne pliki, nie ma to nic wspólnego z git Właśnie uruchomiłem polecenie z sudo i działało, więc nie wymagało wszystkich tych kroków
raviramani
To była jedyna rzecz, która działała dla mnie.
Eric
2

Niektóre pliki są chronione przed zapisem, więc nawet git nie może ich nadmiernie zapisać. Zmień uprawnienia do folderu, aby umożliwić zapis, np. Sudo chmod 775 foldername

A następnie wykonać

git pull 

jeszcze raz

Carmela
źródło
1

Pamiętaj również, aby sprawdzić uprawnienia do samego katalogu głównego!

Możesz znaleźć:

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

pojawi się błąd „odmowa uprawnień”.

Cadavre
źródło