Git push error: Tidak dapat memutus tautan lama (Izin ditolak)

193

Di server jarak jauh saya memiliki hook pascakenerima yang diatur untuk membuat checkout git dari repositori saya:

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

Tetapi ketika saya melakukan push dari mesin lokal saya ke repositori git di server, saya mendapatkan pesan kesalahan berikut:

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

Ini muncul berulang kali, satu pesan kesalahan untuk hampir setiap file.

Namun saya memiliki file README.txt yang dapat saya ubah menggunakan git, berikut ini izinnya:

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

Tetapi file lain dengan pemilik yang sama persis dan izin yang sama, beri saya kesalahan itu.

Di repositori lokal lain untuk situs web lain, saya memiliki file dengan nama pengguna mesin lokal saya sebagai pemilik, dan ketika saya mendorong ke server jauh itu menghormati pemilik server jauh dari file dan bekerja seperti pesona.

Jelas itu tampaknya kesalahan terkait izin, tetapi saya tidak dapat menemukan cara untuk memperbaikinya, ada saran?

rfc1484
sumber

Jawaban:

336

Ketika Anda harus memutuskan tautan file, Anda harus memiliki izin 'w' untuk direktori, di mana file tersebut, bukan untuk file ...

Jan Marek
sumber
65
Memang itu masalahnya, saya memperbaikinya menggunakan sudo chmod -R g+wlebih dari folder yang bersalah.
rfc1484
1
OMG terima kasih. Sangat kesal dengan izin berpikir benar pada file. Masuk akal pembaruan sebenarnya lebih seperti mvtindakan daripada hanya ditimpa.
doublejosh
1
Mengubah izin dir memang berhasil untuk saya (terima kasih!) Tapi aneh karena saya bisa secara manual menimpa file yang dipertanyakan melalui sftp tanpa masalah. Aneh bahwa ketika git mencoba melakukan hal yang sama, itu tidak bisa.
Jonathan Stark
1
Juga perlu diingat bahwa jika Anda masih membuka file kesalahan ini juga akan muncul. Memiliki kesalahan yang sama dan itulah sebabnya saya tidak dapat mendorong perubahan saya masuk.
Matias
1
Karakter pertama ls -llayar menunjukkan jenis file dan tidak terkait dengan izin. Sembilan karakter tersisa dalam tiga set, masing-masing mewakili kelas izin sebagai tiga karakter. Set pertama mewakili kelas pengguna. Set kedua mewakili kelas grup. Set ketiga mewakili kelas yang lain. The g+wdi chmod memberikan kelompok set (yang gparameter) izin untuk menulis (dengan wparameter)
rfc1484
68
sudo chmod -R ug+w .;

Perintah ini akan memperbaiki masalah. Ini memberi izin menulis ke folder.

Rajendra kumar Vankadari
sumber
42

Jika Anda menggunakan IDE apa pun, kemungkinan besar masalahnya adalah file tersebut digunakan oleh beberapa proses. Seperti kucing jantan Anda mungkin menggunakan file. Cobalah untuk mengidentifikasi proses tertentu dan tutuplah. Itu seharusnya bisa menyelesaikan masalah Anda.

Rama Krishna Gollapudi
sumber
13

Saya memiliki masalah yang sama dan tidak ada solusi di atas yang berhasil untuk saya. Saya menghapus folder yang menyinggung itu. Kemudian:

git reset --hard

Menghapus file yang tersisa untuk membersihkan status git, lalu lakukan:

git pull

Akhirnya berhasil.

CATATAN: Jika folder itu, misalnya, folder publik dengan file build, ingatlah untuk membangun kembali file

wcyn
sumber
Terima kasih, tidak ada hal lain yang bekerja untuk saya juga, menghapusnya sepertinya menjadi satu-satunya pilihan.
math0ne
Dalam kasus saya, folder yang menyinggung itu adalah .git
Tushar Kathuria
13

Saya pikir masalahnya mungkin dengan kepemilikan ke folder jadi setel ke kepemilikan pengguna saat ini

sudo chown -R your_login_name /path/to/folder
Anda dapat menemukan solusinya [di sini] [1]
Soumitra Sarkar
sumber
8

FWIW - Saya punya masalah yang sama dan saya tidak yakin apakah ini meringankannya (di luar izin mod): Menutup Eclipse yang menggunakan cabang dengan masalah ini.

selo
sumber
Demikian pula saya mendapatkan kesalahan ini ketika file CSV yang dikendalikan versi dibuka di Excel. Cukup dengan menutupnya, Excel berhasil mengatasinya. Ini mungkin berlaku untuk aplikasi lain juga di windows dan mungkin tergantung pada bagaimana program menandai file sebagai terbuka selama pengeditan.
Carel
4

Ini adalah pertanyaan lama, tetapi ini dapat membantu pengguna Mac.

Jika Anda menyalin file dari Time Machine secara manual, alih-alih mengembalikannya melalui Time Machine, itu akan menambahkan ACL ke semuanya, yang dapat mengacaukan izin Anda.

Misalnya, bagian dalam artikel ini yang mengatakan "Cara Memperbaiki Izin File Mac OS X" menunjukkan bahwa "semua orang" memiliki izin khusus, yang mengacaukan semuanya:

Izin buruk, dari http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

Anda perlu menghapus ACL dari direktori / file tersebut. Jawaban Pengguna Super ini masuk ke dalamnya, tapi inilah perintahnya:

sudo chmod -RN .

Kemudian Anda dapat memastikan direktori dan file Anda memiliki izin yang tepat. Saya gunakan 750untuk direktori dan 644file.

kylesimmond
sumber
3

Saya mendapatkan kesalahan ini, dan kesalahan git aneh lainnya, ketika saya memiliki server yang berjalan (di Intellij). Menghentikan server dan mencoba ulang perintah git sering memperbaikinya untuk saya.

Phil Carter
sumber
3
git reset --hard

Bekerja untukku

Kreker
sumber
4
Itu bisa sedikit ekstrem karena jauh lebih banyak.
cdaddr
3
sudo chown -R $USER:$USER .

Melakukan pekerjaan untuk saya.

BARJ
sumber
2

Menarik mungkin telah menciptakan perubahan lokal.

Tambahkan file Anda yang tidak dilacak:

git add.

Stash berubah.

simpanan git

Jatuhkan perubahan lokal.

drop git simpanan

Tarik dengan izin sudo

sudo git tarik cabang jauh

pengguna2858738
sumber
ini semua tentang izin file lokal tidak ada hubungannya dengan git. Saya baru saja menjalankan perintah dengan sudo dan itu berhasil sehingga tidak memerlukan semua langkah ini
raviramani
Ini adalah satu-satunya hal yang berfungsi untuk saya.
Eric
2

Beberapa file terlindungi dari penulisan yang bahkan git tidak dapat menulisnya secara berlebihan. Ubah izin folder untuk memungkinkan penulisan misalnya sudo chmod 775 nama pengguna

Dan kemudian jalankan

git pull 

lagi

Carmela
sumber
1

Ingat juga untuk memeriksa izin direktori root itu sendiri!

Kamu mungkin menemukan:

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

dan kesalahan 'izin ditolak' akan muncul.

mayat
sumber