Bagaimana cara un-submodule a git submodule (membawa semua kode kembali ke inti)?
Seperti bagaimana "seharusnya" saya, seperti dalam "Prosedur terbaik" ...
git
git-submodules
Quickredfox
sumber
sumber
git submodule deinit
, lihat jawaban saya di bawah inigit submodule deinit asubmodule ; git rm asubmodule
sudah cukup, seperti yang diilustrasikan dalam jawaban sayaJawaban:
Jika yang Anda inginkan adalah memasukkan kode submodule Anda ke repositori utama, Anda hanya perlu menghapus submodule dan menambahkan kembali file ke repo utama:
Jika Anda juga ingin mempertahankan sejarah submodule, Anda dapat melakukan trik kecil: "gabungkan" submodule ke dalam repositori utama sehingga hasilnya akan sama seperti sebelumnya, kecuali bahwa file submodule sekarang ada di repositori utama.
Pada modul utama Anda perlu melakukan hal berikut:
Repositori yang dihasilkan akan terlihat sedikit aneh: akan ada lebih dari satu komit awal. Tapi itu tidak akan menyebabkan masalah bagi git.
Dalam solusi kedua ini Anda akan memiliki keuntungan besar bahwa Anda masih dapat menjalankan git menyalahkan atau git log pada file yang semula dalam submodul. Sebenarnya apa yang Anda lakukan di sini adalah mengubah nama banyak file di dalam satu repositori, dan git harus secara otomatis mendeteksi ini. Jika Anda masih memiliki masalah dengan git log, coba beberapa opsi (--follow, -M, -C) yang melakukan lebih baik ganti nama / deteksi salinan.
sumber
git merge
pastikan bahwa akan ada "komit sebelumnya" untuk setiap file (di salah satu dari "sisi" penggabungan).mkdir foo && git mv !(foo) foo && git commit
.--allow-unrelated-histories
untuk memaksa penggabungan pada penggabungan palsu seperti yang saya dapatkanfatal: refusing to merge unrelated histories
, lebih lanjut di sini: github.com/git/git/blob/master/Documentation/RelNotes/…Sejak git 1.8.5 (Nov 2013 ) ( tanpa menyimpan riwayat submodule ):
Itu akan:
deinit
, karenanya yangmv
pertama ),.gitmodules
untukmu (rm
),rm
).Setelah penghapusan submodule selesai (
deinit
dangit rm
), Anda dapat mengganti nama folder kembali ke nama aslinya dan menambahkannya ke repo git sebagai folder biasa.Catatan: jika submodule dibuat oleh Git lama (<1.8), Anda mungkin perlu menghapus
.git
folder bersarang di dalam submodule itu sendiri, seperti dikomentari oleh Simon EastJika Anda perlu menjaga sejarah submodule, lihat jsears 's jawaban , yang menggunakan
git filter-branch
.sumber
deinit
sendirian membersihkan pohon yang bekerja dari submodule Anda?Saya telah membuat skrip yang akan menerjemahkan submodule ke direktori sederhana, sambil mempertahankan semua riwayat file. Itu tidak menderita dari
git log --follow <file>
masalah yang solusi lain menderita. Ini juga merupakan doa satu-baris yang sangat mudah yang melakukan semua pekerjaan untuk Anda. Ayo.Itu dibangun di atas karya luar biasa oleh Lucas Jenß, yang dijelaskan dalam posting blognya " Mengintegrasikan submodule ke dalam repositori induk ", tetapi mengotomatiskan seluruh proses dan membersihkan beberapa kasing sudut lainnya.
Kode terbaru akan dipertahankan dengan perbaikan bug di github di https://github.com/jeremysears/scripts/blob/master/bin/git-submodule-rewrite , tetapi demi protokol jawaban stackoverflow yang tepat, saya telah menyertakan solusi secara keseluruhan di bawah ini.
Pemakaian:
git-submodule-rewrite:
sumber
curl https://raw.githubusercontent.com/jeremysears/scripts/master/bin/git-submodule-rewrite > git-submodule-rewrite.sh
dan./git-submodule-rewrite.sh <submodule-name>
git rm --cached the_submodule_path
.gitmodules
file, atau jika itu hanya submodule, hapus file tersebut.git add the_submodule_path
Saya belum menemukan cara yang lebih mudah. Anda dapat memampatkan 3-5 menjadi satu langkah melalui
git commit -a
- masalah selera.sumber
.gitmodules
bukan.submodules
?.gitmodules
tidak.submodules
.git
direktori submodule sebelumgit add
dapat bekerja pada folder submoduleBanyak jawaban di sini tetapi semuanya tampaknya terlalu rumit dan kemungkinan tidak melakukan apa yang Anda inginkan. Saya yakin kebanyakan orang ingin menyimpan sejarah mereka.
Untuk contoh ini repo utama akan menjadi
[email protected]:main/main.git
dan repo submodule akan[email protected]:main/child.git
. Ini mengasumsikan bahwa submodule terletak di direktori root dari repo induk. Sesuaikan instruksi sesuai kebutuhan.Mulailah dengan mengkloning repo induk dan menghapus submodule lama.
Sekarang kita akan menambahkan repo anak hulu ke repo utama.
Langkah selanjutnya mengasumsikan bahwa Anda ingin memindahkan file pada cabang gabungan-persiapan ke lokasi yang sama dengan submodule di atas meskipun Anda dapat dengan mudah mengubah lokasi dengan mengubah path file.
pindahkan semua folder dan file kecuali folder .git ke folder anak.
Sekarang Anda cukup menggabungkan file Anda kembali ke cabang master.
Lihatlah ke sekeliling dan pastikan semuanya terlihat baik sebelum berjalan
git push
Satu hal yang harus Anda ingat sekarang adalah bahwa git log secara default tidak mengikuti file yang dipindahkan namun dengan menjalankannya
git log --follow filename
Anda dapat melihat riwayat lengkap file Anda.sumber
git merge merge-prep
dan menerima kesalahanfatal: refusing to merge unrelated histories
. Solusi adalah ini:git merge --allow-unrelated-histories merge-prep
.child
direktori, jadi Anda tidak harus memindahkannya nanti? Saya memiliki nama file yang sama dalam submodule dan repo utama ... jadi saya hanya mendapatkan konflik penggabungan karena mencoba menggabungkan kedua file menjadi satu.Itu terjadi pada kami bahwa kami membuat 2 repositori untuk 2 proyek yang sangat digabungkan sehingga tidak masuk akal untuk memisahkannya, jadi kami menggabungkannya.
Saya akan menunjukkan cara menggabungkan cabang-cabang master di masing-masing pertama dan kemudian saya akan menjelaskan bagaimana Anda dapat memperluas ini ke setiap cabang yang Anda dapatkan, semoga ini membantu Anda.
Jika submodule Anda berfungsi, dan Anda ingin mengubahnya menjadi direktori yang dapat Anda lakukan:
Di sini kami melakukan klon bersih untuk bekerja. Untuk proses ini, Anda tidak perlu menginisialisasi atau memperbarui submodul, jadi abaikan saja.
Edit
.gitmodules
dengan editor favorit Anda (atau Vim) untuk menghapus submodule yang akan Anda ganti. Baris yang perlu Anda hapus akan terlihat seperti ini:Setelah menyimpan file,
Di sini kita menghapus hubungan submodule sepenuhnya sehingga kita dapat membuat membawa repo lain ke proyek di tempat.
Di sini kita mengambil repositori submodule untuk digabung.
Di sini kita memulai operasi gabungan dari 2 repositori, tetapi berhenti sebelum melakukan.
Di sini kami mengirim konten master dalam submodule ke direktori di mana ia sebelum awalan nama direktori
Di sini kita menyelesaikan prosedur melakukan komit dari perubahan dalam penggabungan.
Setelah menyelesaikan ini, Anda bisa mendorong, dan mulai lagi dengan cabang lain untuk menggabungkan, cukup checkout cabang di repositori Anda yang akan menerima perubahan dan mengubah cabang yang Anda bawa operasi gabungan dan baca-pohon.
sumber
directory_of_submodule
git log original_path_of_file_in_submodule
yaitu jalan terdaftar di repo git untuk file (yang tidak lagi ada di filesystem) meskipun file submodule sekarang tinggal disubmodule_path/new_path_of_file
Jawaban terbaik untuk ini saya temukan di sini:
http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html
Artikel ini menjelaskan prosedur dengan sangat baik.
sumber
Inilah versi yang sedikit lebih baik (IMHO) dari jawaban @ gyim. Dia melakukan banyak perubahan berbahaya di copy pekerjaan utama, di mana saya pikir itu jauh lebih mudah untuk beroperasi pada klon yang terpisah dan kemudian menggabungkannya bersama di akhir.
Dalam direktori terpisah (untuk membuat kesalahan lebih mudah dibersihkan dan coba lagi) periksa repo atas dan subrepo.
Pertama-tama edit subrepo untuk memindahkan semua file ke subdirektori yang diinginkan
Catat KEPALA
Sekarang hapus subrepo dari repo utama
Dan akhirnya, gabungkan saja
Dan dilakukan! Dengan aman dan tanpa sihir apa pun.
sumber
subrepo
dengan barang-barang di dalamnya?git merge $SUBREPO_HEAD fatal: refusing to merge unrelated histories
Haruskah saya gunakangit merge $SUBREPO_HEAD --allow-unrelated-histories
dalam kasus ini? Atau haruskah itu bekerja tanpa dan saya membuat kesalahan?Untuk kapan
kembali
Konteks: Saya melakukannya
rm -r .git*
di folder submodule saya sebelum menyadari bahwa mereka perlu di-submoduled di proyek utama yang baru saja saya tambahkan. Saya mendapat kesalahan di atas ketika de-submoduling beberapa, tetapi tidak semuanya. Bagaimanapun, saya memperbaikinya dengan menjalankan, (setelah, tentu saja,rm -r .git*
)Perhatikan bahwa ini tidak menyimpan sejarah.
sumber
Berdasarkan jawaban VonC , saya telah membuat skrip bash sederhana yang melakukan ini. Pada
add
akhirnya harus menggunakan wildcard jika tidak akan membatalkan sebelumnyarm
untuk submodule itu sendiri. Sangat penting untuk menambahkan isi direktori submodule, dan tidak menamai direktori itu sendiri diadd
perintah.Dalam sebuah file bernama
git-integrate-submodule
:sumber
Saya merasa lebih nyaman untuk (juga?) Mengambil data komit lokal dari submodule, karena kalau tidak saya akan kehilangan mereka. (Tidak dapat mendorong mereka karena saya tidak memiliki akses ke remote itu). Jadi saya menambahkan submodule / .git sebagai remote_origin2, mengambilnya melakukan dan bergabung dari cabang itu. Tidak yakin apakah saya masih memerlukan submodule remote sebagai asal, karena saya belum cukup akrab dengan git.
sumber
Inilah yang saya temukan terbaik & paling sederhana.
Dalam repo submodule, dari HEAD Anda ingin bergabung ke repo utama:
git checkout -b "mergeMe"
mkdir "foo/bar/myLib/"
(jalur identik dengan tempat Anda ingin file pada repo utama)git mv * "foo/bar/myLib/"
(pindahkan semua ke jalur)git commit -m "ready to merge into main"
Kembali ke repo utama setelah menghapus submodule dan membersihkan jalur "foo / bar / myLib":
git merge --allow-unrelated-histories SubmoduleOriginRemote/mergeMe
booming dilakukan
sejarah terpelihara
jangan khawatir
Perhatikan ini hampir identik dengan beberapa jawaban lain. Tapi ini mengasumsikan Anda memiliki repo submodule. Juga ini membuatnya mudah untuk mendapatkan perubahan hulu untuk submodule di masa depan.
sumber