peringatan: HEAD jarak jauh mengacu pada ref yang tidak ada, tidak dapat melakukan pembayaran

87

Ini sepertinya kesalahan populer karena berbagai penyebab.

Saya punya repo git sederhana bernama "kiflea.git", saya mengkloningnya seperti ini:

git clone git://kipdola.be/kiflea.git

Kemudian git memberi tahu saya: warning: remote HEAD refers to nonexistent ref, unable to checkout.

Dan ya, tidak ada file berversi di peta, kecuali untuk direktori .git. Bagaimanapun, satu-satunya hal yang perlu saya lakukan adalah:

cd kiflea
git checkout master

Dan berhasil, semua file ada di sana. Tapi saya pikir kloning repo secara otomatis memeriksa master, jadi apa yang sebenarnya terjadi, dan bagaimana cara memperbaikinya?

Saya perhatikan bahwa, setelah saya melakukan git checkout mastersedikit, ini akan ditambahkan ke file konfigurasi .git lokal saya:

[branch "master"]
    remote = origin
    merge = refs/heads/master

Mungkin menarik untuk mengetahui bahwa repositori git ini dulunya adalah repositori svn di masa lalu.

NB: saat menjelajahi repositori telanjang menggunakan gitweb, jelas ada mastercabang di sana: http://kipdola.be/gitweb/?p=kiflea.git;a=summary

skerit
sumber
2
Apa yang git ls-remote origindiperlihatkan padamu?
CB Bailey
Ini sama sebelum atau sesudah checkout masterbit:25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
skerit
1
Sepertinya repositori jarak jauh telah kehilangan (atau tidak pernah) miliknya HEAD. Apakah Anda memiliki akses langsung ke sana? Jika demikian, lihat di sini
CB Bailey
1
Jika Anda mengkloning repositori dan tidak menentukan cabangnya, ia mencoba menggunakan remote head. Sebagaimana dijelaskan di bawah dalam jawaban, Anda tidak dapat memengaruhi cabang mana secara langsung. Namun dengan memeriksa cabang yang berbeda pada waktu penggandaan, Anda menghindari pemeriksaan ini. Dalam kasus Anda, tampaknya master ada tetapi kepala jarak jauh menunjuk di tempat lain, jadi gunakan:git clone -b master <url> <dir>
eckes

Jawaban:

128

The warning: remote HEAD refers to nonexistent ref, unable to checkout.berarti bahwa remote (telanjang) repositori berisi referensi cabang di file bernama HEADyang tidak dapat ditemukan pada cabang yang diterbitkan dalam repositori yang sama.

Perhatikan bahwa peringatan tersebut hanya berarti bahwa git tidak melakukan pembayaran. Repositori kloning sebaliknya baik-baik saja. Lakukan saja git branch -auntuk melihat kemungkinan cabang dan git checkout the-branch-you-wantuntuk mengatasi masalah tersebut.

Ini biasanya terjadi karena konten default untuk file itu ( .git/HEADatau biasa HEADuntuk repositori telanjang) adalah ref: refs/heads/masteryang mengatakan bahwa jika seseorang pergi ke clonerepositori ini, mereka harus secara default mengkloning cabang refs/heads/master. Secara default Git akan membuat cabang lokal tanpa refs/heads/awalan (yaitu, mastersecara default). Coba git help symbolic-refuntuk informasi lebih lanjut.

Masalah dengan situasi ini adalah Git tidak menyediakan metode untuk memodifikasi referensi simbolik jarak jauh jadi Anda bisa menggunakan sesuatu yang telah diterapkan oleh penyedia hosting Git (misalnya Pengaturan - Cabang default di GitHub jika Anda memiliki hak admin) atau Anda harus menggunakan nama cabang mastersebagai cabang default (karena itulah nilai default untuk ref simbolis itu).

Jika Anda memiliki akses shell ke repo git jarak jauh Anda, Anda dapat dengan mudah di cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZmana XYZnama cabang yang ingin Anda gunakan secara default.

Salah satu cara untuk mengatasi masalah ini adalah dengan membuat repo telanjang jarak jauh baru tanpa komit dan kemudian melakukannya git push name-of-the-remote my-special-branch-nameyang akan menghasilkan repositori kosong yang berisi satu cabang my-special-branch-nametetapi HEADref simbolis masih berisi nilai default yang menunjuk ke master. Akibatnya, Anda akan mendapatkan peringatan tersebut.

Mikko Rantalainen
sumber
20
Perhatikan bahwa peringatan tersebut hanya berarti git tidak berfungsi checkout. Repositori kloning sebaliknya baik-baik saja. Lakukan git branch -auntuk melihat kemungkinan cabang dan git checkout the-branch-you-wantuntuk "memperbaiki" masalahnya.
Mikko Rantalainen
2
Setidaknya seseorang dapat menghindari penggunaan remote head saat menggunakan git clone -b master(atau apapun nama cabang yang ada).
eckes
Saya telah melakukan persis seperti yang Anda tulis di paragraf terakhir; Ada file di cabang di repo telanjang (dalam gitlab) tetapi klon tampaknya kosong. {git branch -a} tidak menunjukkan apa-apa. {git clone -b my-special-branch-name <url>} tampaknya juga tidak berfungsi (ujung jarak jauh ditutup).
Ed Randall
Saya "memperbaikinya" dengan menyalin refs / remote / my-special-branch-name ke refs / heads dan mengedit HEAD agar cocok (di repo gitlab kosong). Saya kemudian bisa berhasil mengkloning menggunakan -b my-special-branch-name. Tetapi bagaimana cara yang benar untuk mengkonfigurasi repo kosong setelah siklus "init" / "push" sehingga klon -b tidak mengalami masalah?
Ed Randall
1
@EdRandall di cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZmana XYZnama cabang default yang ingin Anda gunakan jika git clonedilakukan tanpa -bflag. Jika Anda memiliki masalah lain, harap ajukan pertanyaan baru alih-alih menambahkan pertanyaan sebagai komentar.
Mikko Rantalainen
10

Saya mengalami masalah yang sama karena saya tidak lagi menggunakan mastercabang dan hilang di repositori lokal dan jarak jauh saya.

Repositori jarak jauh masih HEADdiatur ke master, saya telah mengubahnya ke salah satu cabang jarak jauh yang sebenarnya saya gunakan dan semuanya berfungsi dengan baik.

Jika Anda dapat mengakses repositori jarak jauh Anda:

  • Pergi ke Anda remote_repo.git;
  • Edit HEADfile
  • Ganti ref: refs/heads/masterkeref: refs/heads/your_branch
Marco Bonifazi
sumber
kedua kondisi memungkinkan, master telah dihapus dan HEAD masih mengarah ke sana atau HEAD diubah menjadi cabang yang telah dihapus setelah itu. Saya kira (karena kasir master berfungsi) opsi kedua adalah kasus kami. @MarcoBonifazi Dalam hal ini "perubahan" akan menggantikan broken_branchdengan refs/heads/master.
eckes
2
apakah ada cara yang "tepat" untuk menyetel cabang HEAD seperti ini tanpa harus mengedit file?
Ed Randall
@EdRandall di cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZmana XYZnama cabang default yang ingin Anda gunakan jika git clonedilakukan tanpa -bbendera, seperti yang saya katakan di komentar lain.
Mikko Rantalainen
7

Ya, ini terkait dengan klon git Anda yang mencoba melakukan pembayaran di cabang yang berbeda dari master. Lakukan saja ini

git clone user@git-server:project_name.git -b branch_name /some/folder

Ini akan membantu Anda mengkloning cabang yang tepat melalui nama cabangnya.

pal4life
sumber
2

Meskipun kesalahan ini ditampilkan - proyek saya masih terhubung ke repositori yang sesuai - saya menjalankan git branchperintah dan melihat cabang yang sesuai - lalu saya menjalankan git checkout *branchnamedan BOOM - semuanya baik-baik saja.

adswebwork
sumber
Ya, @Mikko menjelaskan apa alasannya. Jika Anda ingin melewati pembayaran, Anda dapat menggunakan opsi -b. (Tetapi lebih baik memperbaiki repo jarak jauh Anda dalam jangka panjang!)
eckes
1

Pasti ada yang salah dengan repositori jarak jauh Anda. Anda mungkin bisa memperbaikinya dengan membuat tiruan baru dari repositori. Juga mendorong komit baru ke cabang master mungkin juga berfungsi.

Jason Axelson
sumber
Saya kira yang Anda maksud: "git push -u asal HEAD: HEAD" Itu tidak menyelesaikan apa pun untuk saya ...
RzR
1

Saya kira itu adalah yang terdepan *dalam log komit yang entah bagaimana menipu server jarak jauh.

Saya dapat menelusuri antarmuka web repo menggunakan beberapa tautan menu, tetapi yang lain gagal dengan a 404 - Unknown commit objectatau serupa, terutama dari halaman ringkasan.

Lihat apakah Anda bisa mengubah pesan komit terakhir dan kemudian memaksa mendorong pembaruan untuk melihat apakah itu memperbaikinya. Mungkin ada bug di server demon. Jika berhasil memperbaikinya, sebaiknya laporkan di daftar git [email protected] (hanya pesan teks biasa)

Philip Oakley
sumber
1

Saya memiliki masalah yang sama saat membuat repo telanjang.

Saya menyelesaikannya hanya dengan mengkloning repo, membuat cabang master lokal dan kemudian mendorong master ke repo jarak jauh.

1) kloning repo

$ git.exe clone --progress -v "the remote path" "my local path"

2) buat cabang master secara lokal.

   $ git checkout -b master

3) melakukan sesuatu di cabang lokal

$ git add readme.md 
$ git commit –m “Added readme”

4) Dorong master lokal pada remote

   $ git push origin master
Corrado
sumber
0

Jika sebenarnya tidak ada cabang master yang tersedia, periksa yang berikut ini; Jika ada file bernama 'dikemas-refs' di dalam folder '.git', buka dan Anda dapat menemukan semua referensi yang terdaftar.

Sesuatu seperti di bawah ini;

# pack-refs with: peeled fully-peeled 
e7cc58650190bd28599d81917f1706445d3c6d8b refs/tags/afw-test-harness-1.5
^cfae4f034e82591afdf4e5ed72279297d0eee618
6afe1bcfa4bd74de8e0c8f64d024e1cc289206df refs/tags/afw-test-harness-2.1
^c32f7fa495d4b44652f46c065fcd19c3acd237a6
72f2e4284dfbf27c82967da096c6664646bbdd19 refs/tags/android-1.6_r1
^50992e805e758e2231f28ec2127b57a1a9fd0ddc
0cbd528cad1cee9556098b62add993fc3b5dcc33 refs/tags/android-1.6_r1.1

Kemudian gunakan;

git checkout refs/tags/xxxx

Atau

git checkout 'HASH value'

untuk membayar versi yang diperlukan. Terima kasih.

Samantha
sumber
0

Saya sepertinya memperbaikinya dengan:

git checkout -b  master
git push

Ini menciptakan master default, dan kemudian saya bisa melakukan checkout pada cabang saya yang lain

brendan
sumber
0

Dalam kasus saya, repo itu kosong.

git checkout --orphan master

git add some_file
git commit -m 'init'
git push origin master 
László Tóth
sumber
0

Untuk Gitlab, meskipun itu menunjukkan Anda berada di cabang default (misalnya master) Anda mungkin tidak benar-benar di dalamnya, mengaturnya lagi memperbaikinya, seperti:

  1. Buat cabang baru, mungkin asd
  2. pengaturan> repositori> Cabang Default, yang menunjukkan cabang default adalah master
  3. Setel ke asd
  4. Setel kembali ke master
  5. Hapus asdcabang

Selesai, sekarang cabang default Anda adalah master

Ng Sek Long
sumber