Bagaimana cara menghapus submodule Git?
Ngomong-ngomong, apakah ada alasan yang tidak bisa kulakukan
git submodule rm whatever
?
git
git-submodules
R. Martinho Fernandes
sumber
sumber
git rm modulename
danrm -rf .git/modules/modulename
.git/config
. Jawaban yang diterima menunjukkan cara terbaru untuk sepenuhnya menghapus submodule. Ini juga dijelaskan lebih ringkas dalam jawaban ini: stackoverflow.com/a/36593218/1562138Jawaban:
Sejak git1.8.3 (22 April 2013) :
Proses penghapusan juga menggunakan
git rm
(sejak git1.8.5 Oktober 2013).Ringkasan
Proses penghapusan 3 langkah selanjutnya adalah:
Penjelasan
rm -rf
: Hal ini disebutkan dalam Daniel Schroeder 's jawaban , dan diringkas oleh Eonil di komentar :git rm
: Lihat komit 95c16418 :git submodule deinit
: Berasal dari tambalan ini :Ini berlaku jika (de) langkah inisialisasi (
.git/config
dan.git/modules/xxx
)Sejak git1.8.5, yang
git rm
memakan waktu juga peduli dari:add
' Langkah yang mencatat url submodule dalam.gitmodules
file: perlu dihapus untuk Anda.git rm --cached path_to_submodule
(no trailing slash)Itu akan menghapus direktori yang disimpan dalam indeks dengan mode khusus "160000", menandainya sebagai direktori root submodule .
Jika Anda lupa langkah terakhir itu, dan mencoba menambahkan apa yang merupakan submodule sebagai direktori biasa, Anda akan mendapatkan pesan kesalahan seperti:
Catatan: sejak Git 2.17 (Q2 2018), git submodule deinit tidak lagi berupa skrip shell.
Ini adalah panggilan ke fungsi C.
Lihat komit 2e61273 , komit 1342476 (14 Jan 2018) oleh Prathamesh Chavan (
pratham-pc
) .(Digabung oleh Junio C Hamano -
gitster
- di commit ead8dbe , 13 Feb 2018)sumber
submodule deinit
?.gitmodules
harus ok, tapi saya masih akan memeriksa ulang apa pun dengan.git
direktori (yaitu konfigurasi lokal , dalam repo lokal Anda: itu bukan dimodifikasi oleh agit pull
).gitmodules
entri dan penghapusan entri khusus dalam indeks, dan mendorong repo itu, orang lain dapat menariknya dan submodule itu akan hilang.git rm submodule
melakukan apa yang Anda inginkan seperti yang orang lain katakan.Melalui halaman Git Submodule Tutorial :
Untuk menghapus submodule Anda perlu:
.gitmodules
file..gitmodules
perubahan:git add .gitmodules
.git/config
.git rm --cached path_to_submodule
(tidak ada garis miring)..git
direktori submodule :rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
Lihat juga : langkah-langkah alternatif di bawah ini .
sumber
git submodule rm
hanya menghapus pendaftaran submodule, dan akan terkejut jika perintah itu juga menghapus repositori lokal. Perubahan lokal apa pun akan hilang. Dan mungkin orang lain akan berpikir bahwa hanya file yang akan dihapus.Hanya sebuah catatan. Sejak git 1.8.5.2, dua perintah akan dilakukan:
Seperti yang dijawab oleh @Mark Cheverton dengan benar, jika baris kedua tidak digunakan, bahkan jika Anda menghapus submodule untuk saat ini, folder .git / modules / the_submodule yang tersisa akan mencegah submodule yang sama untuk ditambahkan kembali atau diganti di masa mendatang . Juga, seperti yang disebutkan @VonC,
git rm
akan melakukan sebagian besar pekerjaan pada submodule.--Perbarui (07/05/2017) -
Hanya untuk memperjelas,
the_submodule
adalah jalur relatif dari submodule di dalam proyek. Misalnya,subdir/my_submodule
jika submodule berada di dalam subdirektorisubdir
.Seperti yang ditunjukkan dengan benar di komentar dan jawaban lain , kedua perintah (meskipun secara fungsional cukup untuk menghapus submodule), jangan tinggalkan jejak di
[submodule "the_submodule"]
bagian.git/config
(per Juli 2017), yang dapat dihapus menggunakan perintah ketiga:sumber
.git/config
. Lihat stackoverflow.com/a/36593218/1562138 untuk cara lengkap menghapus submodule.git init && git submodule add <repository> && git rm <name>
meninggalkan.git/config
entri dan.git/modules/<name>
direktori serta isinya. Mungkin Anda tidak menginisialisasi submodule sebelum menghapusnya?Mayoritas jawaban untuk pertanyaan ini sudah usang, tidak lengkap, atau tidak perlu rumit.
Sebuah submodule yang dikloning menggunakan git 1.7.8 atau yang lebih baru akan meninggalkan paling banyak empat jejak dirinya di repo lokal Anda. Proses untuk menghapus keempat jejak tersebut diberikan oleh tiga perintah di bawah ini:
sumber
Langkah sederhana
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
rm -rf $submodulepath
rm -rf .git/modules/$submodulename
Harap dicatat:
$submodulepath
tidak mengandung garis miring depan atau belakang.Latar Belakang
Ketika Anda melakukannya
git submodule add
, itu hanya menambah.gitmodules
, tetapi begitu Anda melakukannyagit submodule init
, itu ditambahkan ke.git/config
.Jadi jika Anda ingin menghapus modul, tetapi dapat mengembalikannya dengan cepat, maka lakukan saja ini:
Ini adalah ide yang baik untuk dilakukan
git rebase HEAD
pertama dangit commit
pada akhirnya, jika Anda menempatkan ini dalam skrip.Lihat juga jawaban untuk dapatkah saya membatalkan populasi suatu submisi Git? .
sumber
for dir in directory/*; do git rm --cached $dir; done
.git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'
- - sepertinya Anda harus benar-benar melakukan ini jika ada sesuatu yang kacau, jika tidak hanyagit submodule | grep -v '^+' | cut -d' ' -f3
git submodule | grep '^+' | cut -d' ' -f2
submodulename
tanda kutip ganda"submodulename"
.. merujuk.git/config
fileSelain rekomendasi, saya juga harus
rm -Rf .git/modules/path/to/submodule
dapat menambahkan submodule baru dengan nama yang sama (dalam kasus saya, saya mengganti garpu dengan yang asli)sumber
Untuk menghapus submodule yang ditambahkan menggunakan:
Lari:
Itu dia.
Untuk versi lama git (sekitar ~ 1.8.5) gunakan:
sumber
git rm
masih meninggalkan barang.git/modules/
. (2.5.4)git rm
tidak; Tes cepat dengan 2.5.4 pada mac saya memperbarui file .gitmodules, seperti yang dijelaskan dalam dokumentasi di sini: git-scm.com/docs/git-rm#_submodules ... tetapi jika Anda telah menemukan semacam kombinasi platform / versi di mana ini tidak terjadi, Anda mungkin harus memasukkan bug tentang itu.git rm
meninggalkan barang-barang di.git/modules/
dir dan.git/config
file (ubuntu, git 2.7.4). Jawaban lain berfungsi 100%: stackoverflow.com/a/36593218/4973698Anda harus menghapus entri di
.gitmodules
dan.git/config
, dan menghapus direktori modul dari riwayat:Jika Anda akan menulis di milis git, mungkin seseorang akan melakukan skrip shell untuk Anda.
sumber
Anda dapat menggunakan alias untuk mengotomatiskan solusi yang disediakan oleh orang lain:
Masukkan itu di git config Anda, dan kemudian Anda bisa melakukannya:
git rms path/to/submodule
sumber
git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two
. KEDUA: Anda harus menjalankan ini dari jalur yang benar.git
alias harus bekerja di mana saja di meja kerja (atau gagal dengan anggun). KETIGA:git config -f .git/config
gagal dalam submodul, seperti.git
biasanya ada file di sana.Singkatnya, inilah yang harus Anda lakukan:
Setel
path_to_submodule
var (tanpa trailing slash):path_to_submodule=path/to/submodule
Hapus baris yang relevan dari file .gitmodules:
git config -f .gitmodules --remove-section submodule.$path_to_submodule
Hapus bagian yang relevan dari .git / config
git config -f .git/config --remove-section submodule.$path_to_submodule
Hapus tahapan dan hapus hanya $ path_to_submodule dari indeks (untuk mencegah kehilangan informasi)
git rm --cached $path_to_submodule
Lacak perubahan yang dilakukan pada .gitmodules
git add .gitmodules
Komit proyek super
git commit -m "Remove submodule submodule_name"
Hapus file submodule yang sekarang tidak dilacak
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
sumber
git submodule update
,. Dan jika jalur submodula tidak diperbarui dengan benar (git melempar kesalahan), hapuslah:rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
Jika submodule ditambahkan secara tidak sengaja karena Anda menambahkan, berkomitmen, dan mendorong folder yang sudah menjadi repositori Git (berisi
.git
), Anda tidak akan memiliki.gitmodules
file untuk diedit, atau apa pun di dalamnya.git/config
. Dalam hal ini yang Anda butuhkan adalah:FWIW , saya juga menghapus
.git
folder sebelum melakukangit add
.sumber
Saya menemukan
deinit
karya yang bagus untuk saya:Dari git docs :
sumber
git
s yang tahudeinit
, sebagai jawaban lain menghapus.git/modules/submodule
direktori terlalu dini, yang tampaknya membuat lebih barugit
s gagal sekarang atau kemudian. Juga (lihat komentar saya di sana) menghapus.git/modules/submodule
mungkin jalan yang salah, jadi ini adalah langkah berbahaya, sebaiknya diambil nanti hanya ketikagit
mengeluh (atau jika Anda yakin 299% ini apa yang Anda inginkan, adalah jalur yang benar dan benar-benar dibutuhkan).git commit
melakukan perubahan bertahap dalam direktori kerja:modified .gitmodules
dandeleted <submodule-path>
.Setelah bereksperimen dengan semua jawaban berbeda di situs ini, saya berakhir dengan solusi ini:
Ini mengembalikan keadaan yang sama persis seperti sebelum Anda menambahkan submodule. Anda dapat segera menambahkan submodule lagi, yang tidak mungkin dengan sebagian besar jawaban di sini.
Ini membuat Anda checkout bersih tanpa perubahan untuk melakukan.
Ini diuji dengan:
sumber
git rm --cached $path
iturm -rf $path
alih-alihgit rm -r $path
?git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'
-> ketika Anda mencoba menghapus 'berbahaya .. submodul' dengan skrip Anda, wasiat inirm -rf ..
yang kemungkinan besar tidak seperti yang Anda inginkan ..Apa yang saya lakukan saat ini Desember 2012 (menggabungkan sebagian besar jawaban ini):
sumber
Inilah yang saya lakukan:
1.) Hapus bagian yang relevan dari file .gitmodules. Anda dapat menggunakan perintah di bawah ini:
2.) Tahap
.gitmodules
perubahan3.) Hapus bagian yang relevan dari
.git/config
. Anda dapat menggunakan perintah di bawah ini:4.) Hapus gitlink (tanpa garis miring):
5.) Bersihkan
.git/modules
:6.) Berkomitmen:
7.) Hapus file submodule yang sekarang tidak dilacak
sumber
fatal: no submodule mapping found in .gitmodules for path 'submodule_name'
pada langkah 3. Namun kedua langkah itu perlu. (git v2.8.2)Baru-baru ini saya menemukan proyek git yang mencakup banyak perintah terkait git yang berguna: https://github.com/visionmedia/git-extras
Instal dan ketik:
Kemudian semuanya selesai. Direktori submodule akan dihapus dari repo Anda dan masih ada di sistem file Anda. Anda kemudian dapat melakukan perubahan seperti:
git commit -am "Remove the submodule"
.sumber
git delete-submodule
, sebagaimanagit-extras
harus berada di jalur untuk bekerja. Juga perhatikan bahwa saya sarankan untuk tidak menggunakangit-extras
, karena banyak bagian yang sangat buggy dan berbahaya . IEgit-delete-submodule
mungkin menghilangkan jalur yang salah di bawah ini.git/modules/*
, karena mengasumsikan bahwa modul dan jalurnya identik (yang sering kali tidak terjadi), dan itu tidak berfungsi dengan benar jika Anda mencoba untuk menghapus submodule dalam submodule.git-extras
mungkin 99% membantu, tapi tolong jangan mengeluh jika ada yang salah menggunakannya. ANDA TELAH DIPERINGATKAN!Saya harus mengambil langkah John Douthat selangkah lebih maju dan
cd
masuk ke direktori submodule, dan kemudian menghapus repositori Git:Lalu saya bisa mengkomit file sebagai bagian dari repositori induk Git tanpa referensi lama ke submodule.
sumber
git rm --cache
langkah tersebut.Inilah 4 langkah yang menurut saya perlu atau berguna (yang penting dulu):
Secara teori ,
git rm
pada langkah 1 harus mengatasinya. Mudah-mudahan, bagian kedua dari pertanyaan OP dapat dijawab secara positif suatu hari (bahwa ini dapat dilakukan dalam satu perintah).Tetapi pada Juli 2017, langkah 2 diperlukan untuk menghapus data
.git/modules/
, jika tidak, Anda tidak dapat menambahkan lagi submodule di masa depan.Anda mungkin bisa lolos dengan dua langkah di atas untuk git 1.8.5+ seperti jawaban tinlyx dicatat, karena semua
git submodule
perintah tampaknya bekerja.Langkah 3 menghapus bagian
the_submodule
dalam file.git/config
. Ini harus dilakukan untuk kelengkapan. (Entri dapat menyebabkan masalah untuk versi git yang lebih lama, tapi saya tidak punya satu untuk menguji).Untuk ini, sebagian besar jawaban menyarankan menggunakan
git submodule deinit
. Saya merasa lebih eksplisit dan kurang membingungkan untuk digunakangit config -f .git/config --remove-section
. Menurut dokumentasi git-submodule ,git deinit
:Last but not least, jika tidak
git commit
, Anda akan / mungkin mendapatkan kesalahan saat melakukangit submodule summary
(pada git 2.7):Ini terlepas dari apakah Anda melakukan langkah 2 atau 3.
sumber
sumber
Saya baru saja menemukan file tersembunyi .submodule (lupa nama persis), memiliki daftar ... Anda dapat menghapusnya secara individual dengan cara itu. Saya baru saja punya, jadi saya menghapusnya. Sederhana, tapi itu mungkin mengacaukan Git, karena aku tidak tahu apakah ada yang melekat pada submodule. Sepertinya ok sejauh ini, selain dari masalah upgrade libetpan yang biasa, tapi itu (semoga) tidak berhubungan.
Melihat tidak ada yang memposting penghapusan manual, jadi ditambahkan
sumber
.gitmodules
Dengan git 2.17 ke atas, itu hanya:
sumber
git 2.17.1
maupungit 2.20.1
. Namun menggunakangit rm
alih-alihgit add
bekerja untuk keduanya. Catatan:-f
tidak diperlukan jika semuanya bersih. Pastikan untuk tidak pernah menggunakan opsi dengangit
jika Anda ingin melindungi terhadap kehilangan data yang tidak diinginkan. Perhatikan juga bahwa ini tetap.git/modules/{module_name}
berlaku. Ini adalah praktik terbaik untuk tetap di sana karenagit
mencetak yang benar (!) Membantu bagaimana melanjutkan jika ada sesuatu yang diblokir karena ini.Jika Anda baru saja menambahkan submodule, dan misalnya, Anda cukup menambahkan submodule yang salah atau Anda menambahkannya ke tempat yang salah, cukup lakukan
git stash
kemudian hapus folder tersebut. Ini dengan asumsi bahwa menambahkan submodule adalah satu-satunya yang Anda lakukan dalam repo baru-baru ini.sumber
Untuk kepentingan pembaca, ini di sini mencoba untuk meringkas dan memberikan panduan langkah demi langkah tentang bagaimana melakukannya jika hal-hal tidak berfungsi seperti yang diharapkan. Berikut ini adalah cara yang aman dan teruji untuk
git
versi2.17
dan di atasnya untuk menyingkirkan submodule :2.20.1
dan Ubuntu 18.042.17.1
."$submodule"
hanya untuk menekankan di mana harus meletakkan nama, dan bahwa Anda harus berhati-hati dengan spasi dan sejenisnya"$submodule"
dengan cara Windows jalur yang ditentukan dengan benar ke submodule. (Saya bukan Windows)Catat itu
adalah kebalikan langsung ke
tapi
juga cukup terbalik
karena beberapa perintah pada dasarnya perlu melakukan lebih dari satu hal:
git submodule deinit -- module
.git/config
git rm
.gitmodules
git submodule add
.git/modules/NAME/
git submodule init
, jadi pembaruan.git/config
git submodule update
, jadi, memeriksa modul secara tidak rekursif.gitmodules
git submodule update --init --recursive -- module
Ini tidak dapat sepenuhnya simetris, karena menjaganya tetap simetris tidak masuk akal. Tidak perlu ada lebih dari dua perintah. Juga "menarik data" adalah implisit, karena Anda membutuhkannya, tetapi menghapus informasi yang di-cache tidak dilakukan, karena ini tidak diperlukan sama sekali dan mungkin menghapus data berharga.
Ini benar-benar membingungkan bagi pendatang baru, tetapi pada dasarnya adalah hal yang baik:
git
lakukan saja hal yang jelas dan lakukan itu dengan benar, dan bahkan tidak mencoba untuk berbuat lebih banyak.git
adalah alat, yang harus melakukan pekerjaan yang dapat diandalkan, alih-alih menjadi sekadar "Eierlegende Wollmilchsau" ("Eierlegende Wollmilchsau" menerjemahkan bagi saya menjadi "versi jahat pisau tentara Swiss").Jadi saya mengerti keluhan orang, mengatakan "Mengapa tidak melakukan
git
hal yang jelas bagi saya". Ini karena "jelas" di sini tergantung dari sudut pandang. Keandalan dalam setiap situasi jauh lebih penting. Oleh karena itu apa yang jelas bagi Anda sering bukan hal yang benar dalam semua situasi teknis yang memungkinkan. Harap diingat bahwa: AFAICSgit
mengikuti jalur teknis, bukan jalur sosial. (Oleh karena itu nama pintar: git)Jika ini gagal
Perintah di atas mungkin gagal karena hal berikut:
git
terlalu tua. Kemudian gunakan yang lebih barugit
. (Lihat di bawah bagaimana caranya.)git clean
arti tertentu. Kemudian pertama-tama bersihkan submodule Anda menggunakan perintah itu. (Lihat di bawah.)git
. Kemudian Anda berada di sisi gelap dan segalanya menjadi jelek dan rumit. (Mungkin menggunakan mesin lain untuk memperbaikinya.)git
pengguna-daya).Kemungkinan perbaikan mengikuti.
Gunakan yang lebih baru
git
Jika mesin Anda terlalu tua, tidak ada
submodule deinit
di komputer Andagit
. Jika Anda tidak ingin (atau dapat) memperbaruigit
, gunakan saja komputer lain dengan yang lebih barugit
!git
dimaksudkan untuk didistribusikan sepenuhnya, sehingga Anda dapat menggunakan yang laingit
untuk menyelesaikan pekerjaan:workhorse:~/path/to/worktree$ git status --porcelain
tidak boleh mengeluarkan apapun! Jika ya, bersihkan dulu!workhorse:~/path/to/worktree$ ssh account@othermachine
othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
othermachine:~/TMPWORK$ git commit . -m . && exit
workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD
. Jika ini tidak berhasil, gunakangit reset --soft FETCH_HEAD
git status
bersihkan , sampai bersih kembali. Anda dapat melakukannya, karena Anda telah membersihkannya sebelumnya, berkat langkah pertama.Ini
othermachine
bisa berupa VM, atau Ubuntu WSL di Windows, apa pun. Bahkan achroot
(tapi saya berasumsi bahwa Anda non-root, karena jika Andaroot
harus lebih mudah untuk memperbarui ke yang lebih barugit
).Perhatikan bahwa jika Anda tidak bisa
ssh
masuk, ada banyak cara untuk mengangkutgit
repositori. Anda dapat menyalin worktree Anda pada beberapa stik USB (termasuk.git
direktori), dan mengkloning dari stik. Mengkloning salinan, hanya untuk mendapatkan hal-hal dengan cara yang bersih lagi. Ini mungkin PITA, jika submodul Anda tidak dapat diakses dari mesin lain secara langsung. Tetapi ada solusi untuk ini juga:Anda dapat menggunakan multiply ini, dan ini disimpan ke dalam
$HOME/.gitconfig
. Sesuatu sepertisuka menulis ulang URL
ke
Sangat mudah jika Anda mulai terbiasa dengan
git
fitur canggih seperti ini.Bersihkan dulu
Membersihkan secara manual baik, karena dengan cara ini Anda mungkin mendeteksi beberapa hal yang Anda lupa.
git status
dan itugit clean -ixfd
adalah temanmurm
dandeinit
selama Anda bisa. Pilihan (seperti-f
) untukgit
yang baik jika Anda seorang Pro. Tetapi ketika Anda datang ke sini, Anda mungkin tidak begitu berpengalaman disubmodule
daerah tersebut. Jadi lebih baik aman daripada menyesal.Contoh:
Anda lihat, tidak
-f
perlusubmodule deinit
. Jika semuanya bersih, dalamgit clean
arti tertentu. Perhatikan juga bahwagit clean -x
tidak diperlukan. Ini berartigit submodule deinit
menghapus tanpa syarat file yang tidak terpantau yang diabaikan. Ini biasanya yang Anda inginkan, tetapi jangan lupakan itu. Terkadang file yang diabaikan mungkin berharga, seperti data cache yang membutuhkan waktu berjam-jam untuk dihitung kembali.Kenapa tidak pernah dihapus
$GIT_DIR/modules/<name>/
?Mungkin orang ingin menghapus repositori dalam cache, karena mereka takut mengalami masalah nanti. Ini benar, tetapi mengalami "masalah" itu adalah cara yang benar untuk menyelesaikannya! Karena perbaikannya mudah, dan dilakukan dengan benar, Anda akan dapat hidup bahagia selamanya. Ini menghindari lebih banyak masalah rumit daripada saat Anda menghapus data sendiri.
Contoh:
Baris terakhir menampilkan kesalahan berikut:
Kenapa kesalahan ini? Karena
.git/modules/two/
sebelumnya telah diisi dari https://github.com/hilbix/empty.git dan sekarang akan diisi ulang dari sesuatu yang lain, yaitu https://github.com/hilbix/src.git . Anda tidak akan melihat ini jika Anda mengisi ulang dari https://github.com/hilbix/empty.gitApa yang harus dilakukan sekarang? Nah, lakukan persis seperti yang diperintahkan! Menggunakan
--name someunusedname
.gitmodules
maka terlihat sepertils -1p .git/modules/
memberiDengan cara ini di masa depan Anda dapat beralih cabang / komit maju dan mundur dan tidak akan pernah mendapat masalah lagi , karena
two/
memiliki dua repositori hulu yang berbeda (dan mungkin tidak kompatibel). Dan yang terbaik adalah: Anda menyimpan keduanya dalam cache secara lokal juga.git
).Namun jika Anda menghapus direktori yang di-cache, kedua pemeriksaan yang berbeda akan saling bertabrakan, karena Anda tidak akan menggunakan
--name
opsi, bukan? Jadi setiap kali Anda melakukan checkout Anda mungkin harus menghapus.git/modules/<module>/
direktori lagi dan lagi. Ini sangat rumit dan membuatnya sulit untuk menggunakan sesuatu sepertigit bisect
.Jadi ada alasan yang sangat teknis untuk menjaga direktori modul ini sebagai pengganti. Orang-orang yang merekomendasikan untuk menghapus sesuatu di bawah
.git/modules/
ini tidak tahu yang lebih baik atau lupa untuk memberi tahu Anda bahwa ini membuat fitur-fitur canggih sepertigit bisect
hampir tidak mungkin digunakan jika ini melintasi ketidakcocokan submodule.Alasan lebih lanjut ditunjukkan di atas. Lihatlah
ls
. Apa yang kamu lihat di sana?Nah, varian modul ke-2
two/
tidak di bawah.git/modules/two/
, itu di bawah.git/modules/someunusedname/
! Jadi hal-hal sepertigit rm $module; rm -f .git/module/$module
itu sama sekali salah! Anda harus berkonsultasimodule/.git
atau.gitmodules
menemukan hal yang benar untuk dihapus!Jadi tidak hanya sebagian besar jawaban lain masuk ke dalam jebakan berbahaya ini, bahkan
git
ekstensi yang sangat populer pun memiliki bug ini ( sekarang sudah diperbaiki di sana )! Jadi, lebih baik tetap tangani.git/
direktori Anda jika Anda tidak tepat, apa yang Anda lakukan!FYI Anda mungkin dapat menebaknya: hilbix adalah akun GitHub saya.
sumber
Singkatnya, inilah yang harus Anda lakukan:
Setel path_to_submodule var (tanpa trailing slash):
Hapus baris yang relevan dari file .gitmodules:
Hapus bagian yang relevan dari .git / config
Hapus tahapan dan hapus hanya $ path_to_submodule dari indeks (untuk mencegah kehilangan informasi)
Lacak perubahan yang dilakukan pada .gitmodules
Komit proyek super
Hapus file submodule yang sekarang tidak dilacak
Lihat juga: Baris panduan alternatif
sumber
git rm --cached $path_to_submodule
dangit add .gitmodules
tidak? Saya memang mendapatkan kesalahan pada perintah pertama:fatal: Please stage your changes to .gitmodules or stash them to proceed
karena saya memiliki perubahan unstaged untuk.gitmodules
. Melakukan yanggit add .gitmodules
pertama menyelesaikan itu.Itu mudah:
.gitmodules
git add .gitmodules
git submodule deinit <path to submodule>
git rm <path to submodule>
Anda harus menghapus file modul pada proyek Anda secara manual.
sumber
git submodule deinit <submodule_name>
dangit rm <path_to_submodule>
. Perintah terakhir secara otomatis menghapus entri di dalam.gitmodules
. Git 2.17Saya telah membuat skrip bash untuk mempermudah proses penghapusan. Ia juga memeriksa apakah ada perubahan dalam repo yang belum disimpan dan meminta konfirmasi. Ini telah diuji pada
os x
akan menarik untuk mengetahui apakah itu berfungsi seperti pada distro linux umum juga:https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
sumber
Dalam git terbaru hanya diperlukan 4 operasi untuk menghapus submodule git.
.gitmodules
git add .gitmodules
git rm --cached <path_to_submodule>
git commit -m "Removed submodule xxx"
sumber
Jika Anda perlu melakukannya dalam satu perintah baris dengan skrip bash seperti di bawah ini:
$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule
Buat file skrip bash dalam
$HOME
direktori bernamaremove_submodule.sh
:sumber
git rm <submodule path> && git commit
. Ini bisa dibatalkan menggunakangit revert
..gitmodules
file.$GIT_DIR/modules/<name>/
.Sumber:
git help submodules
sumber
Menghapus git submodule
Untuk menghapus
git
submodule di bawah ini diperlukan 4 langkah..gitmodules
file. Entri mungkin seperti yang disebutkan di bawah inigit add .gitmodules
git rm --cached <path_to_submodule>
.git commit -m "Removed submodule xxx"
dan dorong.Tambahan 2 langkah lagi yang disebutkan di bawah ini diperlukan untuk membersihkan submodule sepenuhnya dalam salinan kloning lokal.
.git/config
file. Entri mungkin seperti yang disebutkan di bawah inirm -rf .git/modules/path_to_submodule
Langkah 5 dan 6 ini tidak membuat perubahan apa pun yang perlu dilakukan.
sumber
git submodule deinit
git-scm.com/docs/git-submodule#Documentation/…