git pull gagal "tidak dapat menyelesaikan referensi" "tidak dapat memperbarui referensi lokal"

606

Menggunakan git 1.6.4.2, ketika saya mencoba git pullsaya mendapatkan kesalahan ini:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

Saya sudah mencoba git remote prune origin, tetapi itu tidak membantu.

Gabrielle
sumber

Jawaban:

929

Coba bersihkan repositori lokal Anda dengan:

$ git gc --prune=now
$ git remote prune origin

man git-gc (1):

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

man git-remote (1):

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            
Vojtech Vitek
sumber
96
Mengapa ini bekerja? Apa masalah yang diperbaiki?
Ikke
5
Perintah kedua bekerja untuk saya. Tampaknya saya memiliki referensi yang rusak ke cabang jauh yang baru saja dibuat. Tidak yakin bagaimana itu terjadi, tetapi senang itu adalah perbaikan sederhana. Terima kasih, Vitek!
JGTaylor
1
Ini bekerja dengan sempurna! Saya juga suka penjelasan tentang apa yang dilakukan dan mengapa ini berhasil. Terima kasih!
ArielSD
4
Akankah git remote prune originperintah dijalankan pada copy pekerjaan lokal saya atau pada repositori jarak jauh?
user1438038
3
@ user1438038 Seharusnya tidak menghapus cabang dan hanya memperbarui referensi jarak jauh di copy pekerjaan lokal Anda. Info lebih lanjut di sini: stackoverflow.com/questions/20106712/…
Zengineer
606

Terjadi pada saya juga. Dalam kasus saya, wasit yang buruk adalah master, dan saya melakukan yang berikut:

rm .git/refs/remotes/origin/master
git fetch

Ini membuat git mengembalikan file ref. Setelah itu semuanya berjalan seperti yang diharapkan lagi.

Michel Krämer
sumber
1
Saya melakukan hal yang sama, dan itu menyelesaikan masalah saya. Ketika saya membuka file di Notepad ++, itu jelas rusak.
theMayer
83
pastikan Anda memilih file yang memberi Anda masalah alih-alih master
bia.migueis
6
@ bia.migueis: itu tidak akan merusak apa pun jika Anda tidak sengaja menghapus master juga - itu hanya akan diperbarui mengambil berikutnya juga.
naught101
2
Jika submodule, mungkin agak sulit untuk menemukan referensi. Pertama periksa apakah .gitada folder dengan melakukan ls -lajika tidak, lihat isi file .gitfile untuk menemukan folder .git yang sebenarnya di mana referensi tersebut berada. .gitisi file dalam kasus saya: gitdir: ../.git/modules/my-submodule-name
CCoder
1
Dua kali sekarang dalam setahun terakhir saya kembali harus memperbaiki ini dan lagi, ini adalah satu-satunya perbaikan yang benar-benar berfungsi.
Ted
131

Ini berhasil bagi saya:

git gc --prune=now
Bernd
sumber
5
Ini berhasil. Terima kasih telah menyelamatkan hari saya! @Bernd Ada kemungkinan penjelasan tentang perintah?
nashcheez
git gc docs ada di sini
BigRon
1
Bekerja untuk saya juga. Tidak perlu menjalankangit remote prune origin
Airwavezx
87

Bagi saya, ini berfungsi untuk menghapus file yang melempar kesalahan dari folder .git/refs/remotes/origin/.

Brian van Rooijen
sumber
itu berhasil! Tapi karena penasaran, tahukah Anda mengapa kesalahan ini terjadi? (semuanya bekerja dengan baik dan tiba-tiba suatu hari kesalahan ini muncul). Dan apakah Anda tahu bagaimana cara menghapus file itu?
Shreyans
Senang mendengar ini juga memperbaikinya untuk Anda. Sejujurnya saya tidak tahu apa yang menyebabkan kesalahan muncul. Pikir saya adalah bahwa salah satu file di folder tidak sinkron. Karena tidak ada perbaikan lain yang saya temukan bekerja untuk saya, saya menggunakan ini sebagai pilihan terakhir.
Brian van Rooijen
Bekerja dengan baik! Perhatikan Anda harus menghapus semua file yang menyebabkan masalah (berdasarkan laporan kesalahan yang Anda dapatkan), seolah-olah Anda hanya menghapus satu dan mencoba menariknya akan kembali.
Rayee Roded
1
Salah satu penyebab yang mungkin adalah sistem crash seperti yang saya jelaskan dalam jawaban saya . Banyak aplikasi Git GUI yang secara berkala menjalankan Git pada repo Anda (untuk menyegarkan status) dan jika sistem Anda mogok selama Git memanipulasi dengan referensi, mereka mungkin berakhir ditulis ulang dengan NULLs.
David Ferenczy Rogožan
53

Cobalah:

git gc --prune=now

git remote prune origin

git pull
annelorayne
sumber
26
Meskipun ini mungkin menjawab pertanyaan penulis, tidak ada beberapa kata yang menjelaskan dan / atau tautan ke dokumentasi. Cuplikan kode mentah tidak sangat membantu tanpa frasa di sekitarnya. Anda juga dapat menemukan cara menulis jawaban yang baik sangat membantu. Harap edit jawaban Anda.
Roy Scheffers
Persisnya intinya. Tidak cukup untuk memperbaiki kode dan hanya itu. Saya harap ada penjelasan
Musikero31
1
git gc --prune = sekarang memperbarui repositori lokal sambil menghapus file yang tidak perlu. Ini berfungsi baik untuk saya.
Vasyl Gutnyk
45

Jalankan perintah berikut:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

Untuk jaga-jaga, jika Anda perlu tahu apa itu .git/refs/remotes/origin/master, Anda akan membaca bagian Remotes di Git Referensi .

Matias Sebastiao
sumber
1
Bisakah Anda menjelaskan apa itu. Git / refs / remote / origin / branchName? Solusi ini bekerja untuk saya
caitcoo0odes
44

Saya hanya ingin menambahkan bagaimana itu bisa terjadi sehingga referensi rusak.

Kemungkinan penyebab root

Pada sistem saya (Windows 7 64-bit), ketika BSOD terjadi , beberapa file referensi yang tersimpan (kemungkinan besar saat ini dibuka / ditulis ketika BSOD terjadi) ditimpa dengan NULLkarakter (ASCII 0).

Seperti yang disebutkan orang lain, untuk memperbaikinya, cukup dengan menghapus file referensi yang tidak valid dan mengambil ulang atau menarik kembali repositori.

Contoh

Kesalahan: cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

Solusi: hapus file%repo_root%/.git/refs/remotes/origin/some/branch

David Ferenczy Rogožan
sumber
1
Skenario yang sama pada Windows 10 64bit - bekerja di git repo ketika BSOD terjadi. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Mencoba git pullsetelah menghapus file pertama yang dikembalikan fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Setelah menghapus file kedua git pull origin masterberhasil.
cjmcdonn
39

Saya memiliki masalah yang sama dan menyelesaikannya dengan masuk ke file yang salah pada:

\repo\.git\refs\remotes\origin\master

File ini penuh dengan nol, saya menggantinya dengan referensi terbaru dari github.

Noel Tock
sumber
2
Punya masalah yang sama, tetapi file .git/refs/remotes/origin/masteritu hanya kosong. Memecahkan masalah dengan menghapusnya.
zinovyev
38

Dalam kasus saya, masalahnya selesai setelah saya menghapus semua file referensi di bawah direktori .git.

Jika Anda melihat pesannya, ia akan memberi tahu Anda file mana yang perlu Anda hapus (khusus).

File yang akan dihapus berada di bawah .git/refs/remotes .

Saya baru saja menghapus semua file di sana, dan menjalankan gc prune

git gc --prune=now

Setelah itu, semuanya bekerja dengan baik.

Uri Shtand
sumber
Dalam kasus saya, saya hanya menghapus .git / refs / remote dan kemudian memperbarui dan mendorong server dan itu berhasil.
Faraz Ahmed
Uri terima kasih. Dalam kasus saya, saya hanya menghapus file di bawah ref / remote / origin / fitur dan saya lakukan - git pull
Deepboy
26

Penjelasan : Tampaknya cabang repo jarak jauh Anda (di Github / bitbucket) telah dihapus, meskipun referensi lokal Anda tidak diperbarui dan menunjuk ke referensi yang tidak ada.

Untuk mengatasi masalah ini:

git fetch --prune
git fetch --all
git pull

Untuk bacaan ekstra - Referensi dari dokumentasi Github :

git-fetch - Unduh objek dan referensi dari repositori lain

--semua Ambil semua remote.

--prune Setelah mengambil, hapus semua cabang pelacakan jarak jauh yang tidak ada lagi di remote.

avivamg
sumber
1
Ini berhasil bagi saya
Onengiye Richard
1
Terima kasih, itu berhasil untuk saya.
Sam
17

git fetch --prune perbaiki kesalahan ini untuk saya:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

Ini mengasumsikan bahwa cabang yang melanggar telah dihapus pada remote.

marczych
sumber
Contoh Anda tampaknya tidak lengkap: tidak menunjukkan apa --pruneyang dapat saya lihat. Juga proTip: hapus prompt kata sandi yang tidak berguna setelah menempelkan contoh.
MarkHu
Anda memang benar - saya meninggalkan output dari perintah fetch tetapi saya hanya memasukkannya ke dalam contoh. Terima kasih atas tipnya untuk menghapus prompt kata sandi juga!
marczych
11

Jika kesalahan ini “tidak dapat memperbarui ref lokal” berulang, bahkan setelah menerapkan jawaban oleh Vojtech Vitek atau Michel Krämer, Anda mungkin memiliki ref yang buruk pada repositori lokal DAN master Anda.

Dalam hal ini, Anda harus menerapkan kedua perbaikan tanpa menarik atau mendorong di antara ...

rm .git/refs/remotes/origin/master
git fetch
git gc --prune=now
git remote prune origin

Resolusi permanen bagi saya hanya tercapai setelah menerapkan kedua perbaikan sebelum push / pull.

Inyoka
sumber
1
Terima kasih untuk ini. perhatikan bahwa saya mengganti 'master' dengan cabang yang gagal misalnya - rm .git / refs / remote / origin / develop
Damien Sawyer
1
Terima kasih atas jawaban Anda, sangat membantu!
naffiq
1
Ini bekerja untuk saya
Janeevan
10

Untuk Menjawab ini dengan sangat singkat, masalah ini muncul ketika lokal Anda memiliki beberapa informasi tentang remote dan seseorang mengubah sesuatu yang membuat remote dan perubahan Anda tidak sinkron.

Saya mendapatkan masalah ini karena seseorang telah menghapus cabang jarak jauh dan sekali lagi dibuat dengan nama yang sama.

Untuk menangani masalah seperti itu, lakukan tarik atau ambil dari jarak jauh.

git remote prune origin

atau jika Anda menggunakan GUI, lakukan pengambilan dari jarak jauh.

masukkan deskripsi gambar di sini

Abhijeet Kamble
sumber
3

Saya bisa bekerja dengan

git remote update --prune
pengguna1238353
sumber
3

Coba ini:

git pull origin Branch_Name

Branch_Name, cabang tempat Anda saat ini.

Jika Anda hanya melakukan git pull, itu menarik semua nama cabang yang dibuat juga.

Jadi adalah alasan Anda mendapatkan ini:

! [new branch]      split-css  -> origin/split-css  (unable to update local ref)
pengguna3832506
sumber
2

Bagi saya, saya memiliki cabang setempat yang bernama feature/phase2dan cabang yang jauh dinamai feature/phase2/data-model. Konflik penamaan adalah penyebab masalah, jadi saya menghapus cabang lokal saya (Anda bisa mengganti nama jika ada yang perlu Anda pertahankan)

Nathan Wallace
sumber
Masalah yang sama di sini - masalah kita juga adalah masalah penamaan kasus Mac / PC, yang membuatnya sulit dikenali (satu nama ditulis dengan huruf besar, yang lain tidak - dan itu bekerja pada PC, tetapi bukan Mac)
rocksteady
2

Jika git gc --prune=now dosen tidak membantumu. (Nasib buruk seperti saya)

Apa yang saya lakukan adalah menghapus proyek di lokal, dan mengkloning kembali seluruh proyek.

Eric Chen
sumber
Ini adalah "Saya mendapat pesan kesalahan jadi saya membeli komputer baru" - pendekatan yang saya tidak harapkan untuk mendapatkan upvotes di situs web ini.
Stephan Vierkant
2

Saya menggunakan Tower dan karena alasan tertentu nama folder saya .git/refs/remotes/origin/Github. Mengubahnya menjadi huruf kecil .git/refs/remotes/origin/githubmemecahkan masalah.

split19
sumber
1

Saya memiliki masalah yang sama. saya mengikuti langkah-langkah berikut

1) beralih cabang Anda yang memiliki masalah ke cabang lain

2) hapus cabang itu

3) checkout lagi.

Catatan: - Anda dapat menyimpan perubahan yang tidak dikomit dan mengembalikannya.

pengguna2619659
sumber
1

Saya menggunakan git prune origindan melakukan pekerjaan.

Ake kue
sumber
0

Saya memiliki masalah yang sama dengan pembaruan komposer. Tetapi bagi saya itu hanya berfungsi setelah saya membersihkan cache komposer dan setelah menghapus isi folder vendor:

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package
memiliki sendiri
sumber
0

Mendapat masalah ini ketika mencoba mengkloning dari git bundlefile yang dibuat, tidak ada jawaban lain yang berhasil karena saya tidak bisa mengkloning repo (jadigit gc dan menghapus / mengedit file tidak ada pertanyaan).

Namun ada cara lain untuk memperbaikinya - file sumber .bundlefile dimulai dengan:

# v2 git bundle
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d HEAD
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master

PACK.......p..x...Kj.0...: (and so on...)

Cukup menghapus baris keempat dengan vim memperbaiki masalah.

Krzysztof Bociurko
sumber
0

Saya punya masalah ini saat menggunakan SourceTree. Saya mencoba menarik lagi dan berhasil. Saya pikir saya Apakah penyihir cabang (checkout) terlalu cepat :).

Situasi saya sedikit berbeda dari poster karena repositori saya relatif kooperatif, tanpa korupsi yang jelas.

Pisis
sumber
0
 # remove the reference file of the branch "lost"
 rm -fv ./.git/refs/remotes/origin/feature/v1.6.9-api-token-bot-reader

 # get all the branches from the master
 git fetch --all

 # git will "know" how-to handle the issue from now on
 #     From github.com:futurice/senzoit-www-server
 # * [new branch]      feature/v1.6.9-api-token-bot-reader ->
 # origin/feature/v1.6.9-api-token-bot-reader

 # and push your local changes
 git push
Yordan Georgiev
sumber
0

Menghadapi masalah yang sama ketika repositori dihapus dan dibuat dengan nama yang sama. Ini hanya berfungsi ketika saya mengatur ulang url jarak jauh seperti di bawah ini;

git asal set-url jarak jauh [GIT_REPO_URL]

Verifikasi url jarak jauh:

git remote -v

Sekarang, semua perintah harus berfungsi seperti biasa.

Ricky Boy
sumber
0

Baru saja mengalami masalah hari ini.

Metode pemecahan masalah: Dengan SourceTree di Windows Server, Anda dapat mencoba menjalankannya sebagai Administrator. Itu memperbaiki masalah saya "tidak dapat memperbarui ref lokal" di Atlassian Source Tree 2.1.2.5 pada Windows Server 2012 R2 di domain.

Jika Anda juga bisa meniru situasi ini, itu membuktikan bahwa masalahnya disebabkan oleh masalah izin. Lebih baik menelusuri dan menemukan penyebab root - mungkin beberapa file tertentu dimiliki oleh pengguna lain dan semacamnya - jika tidak ada efek samping yang tidak diinginkan: Anda harus menjalankan SourceTree sebagai Administrator untuk selamanya.

Lionet Chen
sumber
Yah, saya tidak akan merekomendasikan ini. Anda akan berakhir dengan lebih banyak file dengan izin yang salah. Dan Anda harus menjalankan semua yang memanipulasi dengan file repositori sebagai administrator. Bukankah lebih baik hanya memperbaiki izin di tempat pertama?
David Ferenczy Rogožan
Kamu benar. Tetapi hanya setelah membuatnya berfungsi sebagai Admin, saya baru tahu bahwa itu adalah masalah izin. Jadi ini adalah langkah dalam prosedur diagnosa saya, bukan solusi yang sempurna.
Lionet Chen
Tentu. Tetapi banyak pengguna mungkin hanya mengambil jawaban Anda sebagai solusi tanpa benar-benar mengetahui konsekuensinya. Mungkin lebih baik jika Anda menambahkan perbaikan izin sebagai solusi yang disarankan.
David Ferenczy Rogožan
0

Menuliskan kasus khusus yang dapat menyebabkan masalah ini.

Suatu hari saya mendorong cabang bernama "fitur / subfeature", sambil memiliki cabang "fitur" di remote.

Operasi itu bekerja dengan baik tanpa ada kesalahan di pihak saya, tetapi ketika rekan kerja saya mengambil dan / atau menarik cabang apa pun, mereka semua memiliki pesan kesalahan yang sama persis unable to update local ref,cannot lock ref 'refs/remotes/origin/feature/subfeature .

Ini dipecahkan dengan menghapus featurecabang pada remote ( git push --delete origin feature) dan kemudian menjalankan git remote prune originrepo rekan kerja saya, yang menghasilkan pesan termasuk* [pruned] origin/feature .

Jadi, tebakan saya git fetchsedang mencoba membuat folder subfeatureref di featuregit secara internal (.git / ...), tetapi membuat folder gagal karena sudah ada featureref.

ik1ne
sumber
0

Kami mendapatkan masalah ini ketika pengembang di Mac membuat cabang dengan simbol lebih besar dari ">" pada nama cabang.

Itu menyebabkan masalah di TeamCity, dan pada komputer berbasis Windows lokal yang menjalankan SourceTree. BitBucket membiarkannya tanpa masalah.

Untuk menyelesaikan pengguna menghapus cabang dan membuatnya kembali. Itu bagus dan mudah.

dylanT
sumber
-1

Punya pesan yang sama tetapi dengan direktori, mendapat pesan gagal pada tarikan.

git --prone juga tidak membantu saya. Ternyata ada file dengan nama yang sama dengan direktori yang dibuat dari jarak jauh.

Harus pergi ke .git \ logs \ refs \ remote \ origin dan menghapus file lokal - lalu tarik lagi, semuanya baik-baik saja.

Asaf Maoz
sumber