Saya punya proyek dengan submodule yang menunjuk ke komit yang tidak valid: komit submodul tetap lokal dan ketika saya mencoba mengambilnya dari repo lain saya mendapatkan:
$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'
Saya tahu apa yang harus menjadi kepala HEAD submodule, apakah ada cara saya dapat mengubah ini secara lokal, tanpa mendorong dari repo yang memang memiliki komitmen 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
?
Saya tidak yakin apakah saya jelas ... inilah situasi serupa yang saya temukan.
git
git-submodules
Mauricio Scheffer
sumber
sumber
Jawaban:
Dengan asumsi repositori submodule memang berisi komit yang ingin Anda gunakan (tidak seperti komit yang dirujuk dari keadaan super-proyek saat ini), ada dua cara untuk melakukannya.
Yang pertama mengharuskan Anda sudah tahu komit dari submodule yang ingin Anda gunakan. Ini bekerja dari "dalam, luar" dengan langsung menyesuaikan submodule kemudian memperbarui proyek-super. Yang kedua bekerja dari "luar, dalam" dengan menemukan komit proyek-super yang memodifikasi submodule dan kemudian mengatur ulang indeks proyek-super untuk merujuk ke komit submodul yang berbeda.
Luar dalam
Jika Anda sudah tahu komit mana yang Anda inginkan submodule untuk digunakan,
cd
ke submodule, periksa komit yang Anda inginkan, lalugit add
dan komitgit commit
itu kembali di super-proyek.Contoh:
Ups, seseorang membuat komit super proyek yang mengacu pada komit yang tidak dipublikasikan dalam submodule
sub
. Entah bagaimana, kita sudah tahu bahwa kita ingin submodule untuk dikomit5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Pergi ke sana dan periksa langsung.Checkout di Submodule
Karena kami memeriksa komit, ini menghasilkan KEPALA terpisah dalam submodule. Jika Anda ingin memastikan bahwa submodule menggunakan cabang, maka gunakan
git checkout -b newbranch <commit>
untuk membuat dan checkout cabang di komit atau checkout cabang yang Anda inginkan (mis. Satu dengan komit yang diinginkan di ujung).Perbarui Super-proyek
Checkout dalam submodule tercermin dalam super-proyek sebagai perubahan pada pohon kerja. Jadi kita perlu melakukan tahapan dalam indeks proyek super dan memverifikasi hasilnya.
Periksa hasilnya
Pembaruan submodule diam karena submodule sudah di komit yang ditentukan. Perbedaan pertama menunjukkan bahwa indeks dan tabel kerja adalah sama. Perbedaan ketiga menunjukkan bahwa satu-satunya perubahan yang dipentaskan adalah memindahkan
sub
submodule ke komit yang berbeda.Melakukan
Ini melakukan entri submodul yang diperbaiki.
Di luar, Di
Jika Anda tidak yakin komit mana yang harus Anda gunakan dari submodule, Anda dapat melihat riwayat di proyek super untuk memandu Anda. Anda juga dapat mengatur reset secara langsung dari proyek-super.
Ini adalah situasi yang sama seperti di atas. Tapi kali ini kita akan fokus pada memperbaikinya dari super-proyek daripada masuk ke submodule.
Temukan Komitmen Pelanggaran proyek-Super
OK, sepertinya sudah rusak
ce5d37c
, jadi kami akan mengembalikan submodule dari induknya (ce5d37c~
).Atau, Anda dapat mengambil komit submodul dari teks tambalan (
5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) dan menggunakan proses "dalam, luar" di atas.Checkout di proyek-Super
Ini mengatur ulang entri submodule untuk
sub
melakukan apa yang dilakukance5d37c~
di super-proyek.Perbarui Submodule
Pembaruan submodule berjalan OK (ini menunjukkan HEAD terlepas).
Periksa hasilnya
Perbedaan pertama menunjukkan bahwa
sub
sekarang sama dice5d37c~
. Perbedaan kedua menunjukkan bahwa indeks dan tabel kerja adalah sama. Dif ketiga menunjukkan satu-satunya perubahan bertahap adalah memindahkansub
submodule ke komit yang berbeda.Melakukan
Ini melakukan entri submodul yang diperbaiki.
sumber
e47c0a
komit yang tidak ada di repositori lokal untuksub
, namun super-proyeksub
menunjuk ke komit itu. Ini mungkin terjadi karena orang lain yang dibuate47c0a
dalam salinan merekasub
, memperbarui proyek-super mereka untuk menunjukkan komitmen itu dan mendorong proyek-super tanpa mendoronge47c0a
ke repositori pusat / bersamasub
. Ketika kita tarik dari pusat / bersama super-proyek kita mendapatkan komit yang poinsub
kee47c0a
, tapi kami tidak bisa “melihat” yang melakukan.ce5d37c
dicurigai karena, berdasarkan diff, itu diperkenalkane47c0a
.sub
disimpan di repo induk yang memilikinya sebagai submodule, dan apakah itu dapat dimanipulasi langsung ke KEPALA saat inisub
secara langsung, tanpa bergantung pada keadaan yang lebih tua dari induk repo, yang mungkin tidak selalu membantu.coba ini:
sumber
git submodule sync
itu diperlukan dalam skenario di mana URL remote untuk submodule yang diberikan telah berubah. Dalam kasus kami, kami telah menambahkan submodule kami dari repo publik dan kemudian mengubah URL ke garpu pribadi - dan memasukkan diri ke acar khusus ini.Kesalahan ini dapat berarti bahwa komit tidak ada dalam submodule. Yaitu, repositori (A) memiliki submodule (B). A ingin memuat B sehingga menunjuk ke komit tertentu (dalam B). Jika komit itu entah bagaimana hilang, Anda akan mendapatkan kesalahan itu. Setelah kemungkinan penyebabnya: referensi ke komit didorong dalam A, tetapi komit sebenarnya tidak didorong dari B. Jadi saya akan mulai dari sana.
Kemungkinan kecil, ada masalah izin, dan komit tidak dapat ditarik (mungkin jika Anda menggunakan git + ssh).
Pastikan path submodule terlihat ok di .git / config dan .gitmodules.
Satu hal terakhir untuk dicoba - di dalam direktori submodule: git reset HEAD --hard
sumber
Kemungkinan penyebabnya
Ini dapat terjadi ketika:
misalnya sesuatu seperti ini terjadi:
Seharusnya submodule didorong pada saat ini.
Akibatnya, komit yang hilang tidak dapat ditemukan oleh pengguna jarak jauh karena mereka masih ada di disk lokal.
Larutan
Informasikan orang yang memodifikasi submodule untuk mendorong, yaitu
sumber
Saya mendapatkan kesalahan ini ketika saya melakukannya:
tetapi komit dalam proyek induk menunjuk pada komit sebelumnya.
Menghapus folder submodule dan menjalankan:
TIDAK menyelesaikan masalah. Saya menghapus repo dan mencoba lagi tanpa bendera yang dalam dan berhasil.
Kesalahan ini terjadi di Ubuntu 16.04 git 2.7.4, tetapi tidak pada Ubuntu 18.04 git 2.17, TODO menemukan perbaikan yang tepat pada komit atau versi.
sumber
username/repo#sha
ke package.json, opsi yang jauh lebih fleksibel adalah mengatur sistem Anda dengan seperangkat wadah buruh pelabuhan--depth=1
menghemat banyak bandwidth saat saya tidak membutuhkan riwayat repo. Jika ada yang menemukan atau tahu mengapa ini terjadi, saya ingin tahu.deinit
pendekatan yang memperbaiki masalah sebagian besar waktu. Ketika dibundel dengan sistem build, pengguna akhir dapat membiarkan sistem build mengambil submodul dan membuangrecursive
perintah yang rusak sama sekali. Masih ada skenario di mana ini rusak, seperti submodule telah melakukan push force dan menghapus komit sama sekali.Ini juga dapat terjadi ketika Anda memiliki submodule yang menunjuk ke repositori yang telah direstrukturisasi dan komit yang diberikan "hilang". Meskipun komit masih dalam repositori jarak jauh, komit tidak ada dalam cabang. Jika Anda tidak dapat membuat cabang baru (mis. Bukan repositori Anda), Anda harus memperbarui proyek super untuk menunjuk komit baru. Atau Anda dapat mendorong salah satu salinan submodul Anda di tempat lain dan kemudian memperbarui proyek-super untuk menunjuk ke repositori itu.
sumber
Cabang Anda mungkin tidak mutakhir, solusi sederhana tetapi cobalah
git fetch
sumber
Jawaban ini untuk pengguna SourceTree dengan pengalaman terminal git terbatas.
Buka submodule yang bermasalah dari dalam proyek Git (proyek-super).
Ambil dan pastikan 'Ambil semua tag' dicentang.
Rebase, tarik proyek Git Anda.
Ini akan menyelesaikan masalah 'referensi bukan pohon' 9 dari sepuluh kali. 1 kali itu tidak akan, adalah perbaikan terminal seperti yang dijelaskan oleh jawaban teratas.
sumber
Riwayat submodule Anda tetap tersimpan dengan aman di submodule git.
Jadi, mengapa tidak menghapus saja submodule dan menambahkannya lagi?
Jika tidak, apakah Anda mencoba mengedit secara manual
HEAD
atau direfs/master/head
dalam submodule.git
sumber
Untuk memastikannya, coba perbarui
git
binari Anda .GitHub untuk Windows memiliki versi
git version 1.8.4.msysgit.0
yang dalam kasus saya adalah masalahnya. Pembaruan menyelesaikannya.sumber
Dalam kasus saya, tidak ada jawaban di atas yang menyelesaikan masalah bahkan meskipun mereka adalah jawaban yang baik. Jadi saya memposting solusi saya (dalam kasus saya ada dua klien git, klien A dan B):
pergi ke dir submodule:
checkout ke master:
rebase ke kode komit yang bisa dilihat oleh kedua klien
kembali ke dir induk:
berkomitmen untuk menguasai
ubah ke klien lain, lakukan
rebase
lagi.akhirnya berhasil sekarang! Mungkin kehilangan beberapa komitmen tetapi berhasil.
FYI, jangan mencoba untuk menghapus submodule Anda, itu akan tetap
.git/modules
ada dan tidak dapat membaca submodule ini lagi, kecuali jika reaktif lokal.sumber
Untuk menyinkronkan repo git dengan kepala submodule, jika itu benar-benar yang Anda inginkan, saya menemukan bahwa menghapus submodule dan kemudian membacanya menghindari menghindari bermain-main dengan sejarah. Sayangnya menghapus submodule membutuhkan peretasan alih-alih menjadi perintah git tunggal, tetapi bisa dilakukan.
Langkah-langkah yang saya ikuti untuk menghapus submodule, terinspirasi oleh https://gist.github.com/kyleturner/1563153 :
Sekali lagi, ini bisa berguna jika semua yang Anda inginkan adalah menunjuk ke kepala submodule lagi, dan Anda belum mempersulit hal dengan perlu menjaga salinan lokal dari submodule tetap utuh. Ini mengasumsikan Anda memiliki submodule "benar" sebagai repo sendiri, di mana pun asalnya, dan Anda hanya ingin kembali ke benar termasuk itu sebagai submodule.
Catatan: selalu membuat salinan lengkap dari proyek Anda sebelum melakukan manipulasi semacam ini atau perintah git di luar komit atau dorongan sederhana. Saya akan menyarankan itu dengan semua jawaban lain juga, dan sebagai pedoman umum git.
sumber
Baru saja menemukan masalah ini, dan tidak ada solusi yang bekerja untuk saya. Apa yang ternyata menjadi solusi untuk masalah saya sebenarnya jauh lebih sederhana: upgrade Git. Milik saya adalah 1.7.1, dan setelah saya memutakhirkannya menjadi 2.16.1 (terbaru), masalahnya hilang tanpa jejak! Kira saya meninggalkannya di sini, semoga membantu seseorang.
sumber