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.


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

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.


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

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


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

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 .


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


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.


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.


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.


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.


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.


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



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)

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)


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.


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.


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.


1

Saya menggunakan git prune origindan melakukan pekerjaan.


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

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.


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.


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

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.


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.


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.


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.