Git dan nasty “error: tidak bisa mengunci info yang ada / referensi fatal”

361

Setelah kloning dari repositori git jarak jauh (pada kode yang lebih baik) saya membuat beberapa perubahan, berkomitmen dan mencoba untuk mendorong:

git push origin master

Kesalahan dengan:

error: tidak dapat mengunci info yang ada / referensi yang
fatal: git-http-push gagal

Kasus ini menganggap repositori yang sudah ada.

Apa yang saya lakukan sebelumnya, adalah:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. ubah data
  6. git commit

Di 'kode yang lebih baik' saya tidak memiliki akses ke log git.

Saya menggunakan Windows. Kesalahan terperinci adalah:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:[email protected]/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Saya kloning sebelumnya, kemudian mengubah kode dan melakukan.

AnnD
sumber
Tidak berhasil, kesalahan yang sama lagi.
AnnD
Dua kemungkinan alasan: a) Contoh git lain sedang berjalan (bunuh semua proses git atau reboot) b). Folder git dibuat sebagai Administrator (coba baris perintah administrator untuk operasinya)
FractalSpace
Bagi saya, saya menyelesaikan kesalahan dengan menelepon git fetchsebelumnya git pull.
Levi Fuller
1
Kesalahan itu jahat
RobW

Jawaban:

686

Bagi saya ini berhasil:

git remote prune origin

Karena jawaban ini tampaknya membantu banyak orang, saya menggali sedikit apa yang sebenarnya terjadi di sini. Apa yang akan dilakukan adalah menghapus referensi ke cabang jauh di folder .git/refs/remotes/origin. Jadi ini tidak akan memengaruhi cabang lokal Anda dan tidak akan mengubah apa pun dari jarak jauh, tetapi itu akan memperbarui referensi lokal yang Anda miliki ke cabang jauh. Tampaknya dalam beberapa kasus referensi ini dapat berisi data yang tidak dapat ditangani Git dengan benar.

arno_v
sumber
1
Saya telah menambahkan beberapa informasi latar belakang, tetapi saya harus jujur ​​mengatakan saya tidak tahu persis mengapa dan bagaimana ini bekerja :)
arno_v
1
git asal pangkas jarak jauh bekerja untuk saya. Tetapi saya telah menghapus semua referensi di .git / refs / remote / origin.
Isuru Madusanka
2
Ini persis seperti yang gitdisarankan lakukan, tetapi saya enggan melakukannya karena perintahnya terdengar seperti melakukan sesuatu pada remote.
Membuang Akun
4
Saya berlarigit gc --prune=now
Stanley Mohlala
9
Ini adalah git cmd SCARIEST yang telah saya jalankan dalam beberapa saat. (PS: berhasil)
Sat Thiru
456

Anda ingin mencoba melakukan:

git gc --prune=now

Lihat https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

kiran.gilvaz
sumber
Apakah --prune = sekarang sama dengan --prune = semua? Jika demikian, dokumentasi memperingatkan bahwa Anda mungkin kehilangan benda yang tidak disimpan. Jika ada benda-benda yang tidak disembunyikan, Anda mungkin harus mencoba mendamaikannya sebelum memangkas.
Assaf Israel
3
Life saver, terima kasih. git pullmacet dengan pesan kesalahan yang sama.
Phil Brubaker
4
Ini membantu untuk pengecualian "git error: tidak dapat mengunci ref" pada pengambilan. Terima kasih banyak!
Alexander
9
Ini berhasil untuk saya. Tapi kemudian saya harus terus menjalankan perintah yang sama setiap kali saya menggunakan gitperintah yang berhubungan dengan remote. git remote prune originmenyelesaikan masalah sekali dan untuk semua.
Keyur Golani
menyelamatkan hari saya! Terima kasih banyak :)
Abhishek Gautam
188

Ini terjadi pada saya ketika remote git saya (bitbucket.org) mengubah alamat IP mereka. Perbaikan cepat adalah menghapus dan menambahkan kembali remote, lalu semuanya berfungsi seperti yang diharapkan. Jika Anda tidak terbiasa dengan cara menghapus dan menambahkan kembali remote di git, berikut adalah langkah-langkahnya:

  1. Salin URL git SSH dari remote yang ada. Anda dapat mencetaknya ke terminal menggunakan perintah ini:

    git remote -v

yang akan mencetak sesuatu seperti ini:

 origin [email protected]:account-name/repo-name.git (fetch)
 origin [email protected]:account-name/repo-name.git (push)
  1. Hapus remote dari repo git lokal Anda:

    git remote rm origin

  2. Tambahkan remote kembali ke repo lokal Anda:

    git remote add origin [email protected]:account-name/repo-name.git

johnnyclem
sumber
8
Saya sudah mencoba yang lain, seperti git gc, git prune, rm 'file dengan kunci kesalahan', info server pembaruan git, dll. Hanya jawaban ini yang berfungsi untuk saya. Kadang-kadang seperti reboot windows, reboot dan itu akan berhasil. Sama di sini, cukup hapus dan tambahkan repo lagi, dan semuanya berjalan baik;)
Marquinho Peli
12
Setelah prosedur di atas, saya juga perlu memberitahu git untuk melacak cabang jarak jauh lagi dengan misalnya:git branch -u origin/master
fotinsky
Ini menghapus semua info pelacakan jarak jauh saya di .git / config dan tidak benar-benar berfungsi.
ThomasMcLeod
Ini juga bekerja untuk saya. Yang lainnya tidak bekerja.
dondrzzy
42

Menjalankan perintah git update-ref -d refs/heads/origin/branchmemperbaikinya.

akansh tayal
sumber
4
Perintah itu juga membantu saya, meskipun wasit cabang saya yang jauh sedikit berbeda:git update-ref -d refs/remotes/origin/my_branch
ndeslandes
Ini bekerja untuk saya, sepertinya ini adalah masalah sensitivitas kasus. Ada dua cabang dengan nama yang sama yang didorong ke asal oleh pengguna git lain, satu memiliki huruf kecil semua dan satu huruf besar.
th3uiguy
24

Saya memperbaikinya dengan melakukan hal berikut

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Ini dengan asumsi bahwa cabang lokal dan jauh Anda selaras dan Anda hanya mendapatkan kesalahan referensi sebagai tidak fatal.

FrankMonza
sumber
12

Saya memiliki masalah ini karena saya berada di cabang yang memiliki nama yang mirip dengan cabang hulu. yaitu cabang hulu dipanggil example-branchdan cabang lokal saya dipanggil example-branch/backend. Solusinya mengubah nama cabang lokal saya seperti:

git branch -m <new name goes here>
George Armstrong
sumber
12

Apa yang berhasil untuk saya adalah:

  1. Menghapus .git/logs/refs/remotes/origin/branch
  2. Menghapus .git/refs/remotes/origin/branch
  3. Lari git gc --prune=now
emirc
sumber
1
Bekerja seperti pesona. Jika ada yang menghadapi masalah dengan nama file / folder cabang maka sebenarnya merujuk ke semua file nama folder / folder. Saya harap ini membantu!
Ankit Kesharwani
11

Ini mungkin diselesaikan sekarang. Tapi inilah yang bekerja untuk saya.

  1. Lokasi:

    • Jika repositori yang terkunci ada di sisi server:

      1. ssh ke repositori git Anda di server.
      2. Masuk sebagai pengguna yang memiliki izin untuk mengubah repositori dan navigasikan ke repositori di server Anda.
    • Jika repositori yang dikunci hanya lokal:

      1. Buka konsol git dan arahkan ke direktori repositori.
      2. Jalankan perintah ini:

        git update-server-info
        
  2. Perbaiki izin pada repositori (jauh atau / dan lokal) Anda jika perlu. Dalam kasus saya, saya harus chmodke 777dan chownkeapache:apache

  3. Cobalah untuk mendorong lagi dari repositori lokal:

    git push
    
WolfTail
sumber
7

Beginilah cara kerjanya untuk saya.

  1. cari file kunci Apache DAV di server Anda (mis. / var / lock / apache2 / DAVlock)
  2. Hapus
  3. buat ulang dengan izin tulis untuk server web
  4. restart server web

Alternatif yang lebih cepat:

  1. cari file kunci Apache DAV di server Anda (mis. / var / lock / apache2 / DAVlock)
  2. Kosongkan file: cat /dev/null > /var/lock/apache2/DAVlock
  3. restart server web
orang bodoh
sumber
Ini masalah saya. Terima kasih untuk kirimannya. Saya menjalankan penghapusan dan izin semua dalam satu kesempatan. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely
6

Ini kedengarannya seperti masalah izin - mungkinkah Anda memiliki dua jendela terbuka, mengeksekusi dengan hak terpisah? Mungkin memeriksa kepemilikan folder .git.

Mungkin periksa untuk melihat apakah ada kunci file yang beredar terbuka, mungkin gunakan lsof untuk memeriksa, atau yang setara untuk OS Anda.

Josh
sumber
3

Dalam kasus saya, cabang dipindahkan ke subdirektori dan direktori tersebut disebut cabang. Git bingung dengan itu. Ketika saya menghapus cabang lokal (di SourceTree hanya dengan klik kanan hapus) semuanya berfungsi seperti biasa.

CodingYourLife
sumber
3

Dalam kasus saya setelah mendapatkan pesan ini saya melakukan perintah checkout dan diberi pesan ini:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Setelah menjalankan perintah ini saya kembali normal.

Colin
sumber
2

Memperbarui:

Anda mungkin perlu mengedit file ~ / .netrc Anda:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

Jawaban asli:

Mengapa Anda menonaktifkan ssl? Saya pikir ini mungkin ada hubungannya dengan Anda tidak dapat mendorong melalui https. Saya akan mengembalikannya dan mencoba mendorong lagi:

git config –global http.sslVerify true
ralphtheninja
sumber
1

Pastikan Anda (proses git sebenarnya) memiliki akses ke file .git/info/refsdan file ini tidak dikunci oleh proses lain.

Ivan Danilov
sumber
2
Bagaimana Anda memeriksanya?
Iulian Onofrei
1

Saya mengalami masalah ini, ketika saya mencoba membuat cabang fitur baru yang berisi nama cabang lama, misalnya asal - branch1 dan saya ingin membuat fitur branch1. Itu tidak mungkin, tetapi branch1 / fitur sudah.

pengguna11464384
sumber
1

Dalam kasus saya, saya harus menghapus tag lama secara manual yang telah dihapus pada jarak jauh.

sungguh-sungguh
sumber
1

Dalam kasus saya, itu terhubung dengan nama cabang yang sudah saya buat.

Untuk memperbaiki masalah ini saya telah membuat cabang dengan nama yang pasti tidak ada, seperti:

git checkout -b some_unknown_branch

Lalu saya sudah membersihkan semua cabang saya yang lain (tidak aktif) karena mereka hanya sampah yang tidak perlu.

git branch | grep -v \* | grep -v master | xargs git branch -D

dan kemudian mengganti nama cabang saya saat ini dengan nama yang saya maksudkan, seperti:

git checkout -m my_desired_branch_name
Arsen Khachaturyan
sumber
0

Dalam kasus bettercodes.org, solusinya lebih puitis - satu-satunya masalah adalah hak yang diberikan kepada anggota proyek. Anggota sederhana tidak memiliki hak menulis! Pastikan Anda memiliki hak Moderator atau Administrator. Ini perlu diatur di bettercodes.org di pengaturan proyek oleh Administrator, tentu saja.

yman
sumber
0

Saya melihat kesalahan ini ketika mencoba menjalankan git filter-branchuntuk melepaskan banyak subdirektori ke dalam repositori baru yang terpisah (seperti dalam jawaban ini ).

Saya mencoba semua solusi di atas dan tidak satupun yang berhasil. Akhirnya, saya memutuskan tidak perlu menyimpan semua tag saya dengan buruk di cabang baru dan hanya berlari:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
tessafyi
sumber