Bagaimana cara menghapus submodule?

3539

Bagaimana cara menghapus submodule Git?

Ngomong-ngomong, apakah ada alasan yang tidak bisa kulakukan git submodule rm whatever?

R. Martinho Fernandes
sumber
109
Jawaban sederhana stackoverflow.com/a/21211232/94687 sekarang adalah jawaban yang benar, dan harus ditandai demikian. Sekarang, itu sederhana git rm modulenamedanrm -rf .git/modules/modulename
imz - Ivan Zakharyaschev
10
Itu sebenarnya tidak benar. Jawaban itu tidak membahas menghapus entri submodule dari .git/config. Jawaban yang diterima menunjukkan cara terbaru untuk sepenuhnya menghapus submodule. Ini juga dijelaskan lebih ringkas dalam jawaban ini: stackoverflow.com/a/36593218/1562138
fvgs
Saya menemukan artikel ini sangat membantu dalam menghilangkan submodul. Ini mencakup informasi tentang menghapus entri di .gitsubmodules dan git / file config menghubungkan
Ri_
12
Harap hemat waktu dan langsung buka jawaban yang berfungsi (pada 2017): stackoverflow.com/a/36593218/528313
Vincenzo Pii
Saya sudah bergulat masalah submodule selama dua hari. Terobosan datang ketika saya menemukan ini: forums.developer.apple.com/thread/13102 . Pada dasarnya, Xcode, dan mungkin aplikasi lain, berjuang untuk memperluas url yang mengandung '~'. Setelah saya mengubah ssh: //[email protected]/~/git/MyRepo.git menjadi ssh: //[email protected]/home/username/git/MyRepo.git (lihat jalur sebenarnya di server Anda), semua keanehan menghilang dengan sepuluh menit. Lihat juga stackoverflow.com/questions/32833100/…
Elise van Looij

Jawaban:

2215

Sejak git1.8.3 (22 April 2013) :

Tidak ada cara Porselen untuk mengatakan "Saya tidak lagi tertarik pada submodule ini", begitu Anda menyatakan minat Anda pada submodule dengan " submodule init".
" submodule deinit" adalah cara untuk melakukannya.

Proses penghapusan juga menggunakan git rm(sejak git1.8.5 Oktober 2013).

Ringkasan

Proses penghapusan 3 langkah selanjutnya adalah:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Penjelasan

rm -rf: Hal ini disebutkan dalam Daniel Schroeder 's jawaban , dan diringkas oleh Eonil di komentar :

Ini .git/modules/<path-to-submodule>/tidak berubah.
Jadi jika Anda pernah menghapus submodule dengan metode ini dan menambahkannya lagi, itu tidak akan mungkin karena repositori sudah rusak.


git rm: Lihat komit 95c16418 :

Saat ini menggunakan " git rm" pada sebuah submodule menghapus pohon kerja submodule dari proyek super dan gitlink dari indeks.
Tetapi bagian submodule di .gitmodulesdibiarkan tidak tersentuh, yang merupakan sisa dari submodule yang sekarang dihapus dan mungkin mengganggu pengguna (yang bertentangan dengan pengaturan di .git/config, ini harus tetap sebagai pengingat bahwa pengguna menunjukkan minat pada submodule ini sehingga akan diisi kembali nanti ketika komit yang lebih lama dicentang).

Biarkan " git rm" membantu pengguna dengan tidak hanya menghapus submodule dari pohon kerja tetapi juga dengan menghapus bagian " submodule.<submodule name>" dari .gitmodulesfile dan tahap keduanya.


git submodule deinit: Berasal dari tambalan ini :

Dengan " git submodule init" pengguna dapat memberi tahu git bahwa mereka peduli dengan satu atau lebih submodul dan ingin membuatnya diisi pada panggilan selanjutnya ke " git submodule update".
Tetapi saat ini tidak ada cara mudah mereka dapat memberitahu git mereka tidak peduli lagi dengan submodule dan ingin menyingkirkan pohon kerja lokal (kecuali jika pengguna tahu banyak tentang submodule internal dan menghilangkan pengaturan " submodule.$name.url" dari .git/configbersama-sama dengan pekerjaan. pohon sendiri).

Bantu pengguna tersebut dengan memberikan deinitperintah ' '.
Ini menghapus seluruh submodule.<name>bagian dari .git/configsalah satu untuk submodule (s) yang diberikan (atau untuk semua yang telah diinisialisasi jika ' .' diberikan).
Gagal jika pohon kerja saat ini berisi modifikasi kecuali dipaksakan.
Mengeluh ketika untuk submodule yang diberikan pada baris perintah pengaturan url tidak dapat ditemukan .git/config, tetapi tetap tidak gagal.

Ini berlaku jika (de) langkah inisialisasi ( .git/configdan .git/modules/xxx)

Sejak git1.8.5, yang git rmmemakan waktu juga peduli dari:

  • ' add' Langkah yang mencatat url submodule dalam .gitmodulesfile: perlu dihapus untuk Anda.
  • entri khusus submodule (seperti yang diilustrasikan oleh pertanyaan ini ): git rm menghapusnya dari indeks:
    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:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

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)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"
VONC
sumber
18
Bisakah Anda memberikan contoh penggunaan submodule deinit?
zakdances
5
@ teman Anda di sini adalah salah satu contoh seseorang yang berhasil menggunakannya: stackoverflow.com/a/16161950/6309 . Tetapi perlu diingat bahwa, bertentangan dengan apa yang awalnya saya yakini, 1.8.3 belum dirilis! Pada Unix, Anda dapat mengompilasinya dari sumber.
VonC
2
@HamishDowner entri khusus harus hilang (direktori tidak lagi submodule), dan .gitmodulesharus ok, tapi saya masih akan memeriksa ulang apa pun dengan .gitdirektori (yaitu konfigurasi lokal , dalam repo lokal Anda: itu bukan dimodifikasi oleh a git pull)
VonC
2
@Jayen ya, jika Anda melakukan penghapusan .gitmodulesentri dan penghapusan entri khusus dalam indeks, dan mendorong repo itu, orang lain dapat menariknya dan submodule itu akan hilang.
VonC
3
Dalam git saat ini (v1.9 +), plain old git rm submodulemelakukan apa yang Anda inginkan seperti yang orang lain katakan.
Pete Peterson
3445

Melalui halaman Git Submodule Tutorial :

Untuk menghapus submodule Anda perlu:

  1. Hapus bagian yang relevan dari .gitmodulesfile.
  2. Tahap .gitmodulesperubahan:
    git add .gitmodules
  3. Hapus bagian yang relevan dari .git/config.
  4. Hapus file submodule dari pohon kerja dan indeks:
    git rm --cached path_to_submodule(tidak ada garis miring).
  5. Hapus .gitdirektori submodule :
    rm -rf .git/modules/path_to_submodule
  6. Komit perubahan:
    git commit -m "Removed submodule <name>"
  7. Hapus file submodule yang sekarang tidak dilacak:
    rm -rf path_to_submodule

Lihat juga : langkah-langkah alternatif di bawah ini .

John Douthat
sumber
410
"Dan ngomong-ngomong, apakah ada alasan mengapa aku tidak bisa begitu saja mengirimkan submodule melalui apa pun?" ?
abernier
48
@abernier Jawaban singkatnya bisa "karena tidak ada perintah seperti itu." Dugaan saya adalah bahwa mereka mencoba membuat penghapusan file submodule vs konfigurasi submodule secara eksplisit untuk menghindari kehilangan data yang tidak disengaja. Mungkin satu orang akan berpikir bahwa git submodule rmhanya 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.
John Douthat
119
Terus terang, saya tidak tahu kenapa. Saya harap mereka menambahkan perintah. 4 langkah ini terlalu rumit.
John Douthat
25
Berikut skrip bash yang menghapus submodule, cukup buat alias git untuk submodule-rm;) gist.github.com/2491147
Capi Etheriel
33
juga perlu rm -rf .git \ modules \ nama submodule?
rogerdpack
484

Hanya sebuah catatan. Sejak git 1.8.5.2, dua perintah akan dilakukan:

git rm the_submodule
rm -rf .git/modules/the_submodule

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 rmakan melakukan sebagian besar pekerjaan pada submodule.

--Perbarui (07/05/2017) -

Hanya untuk memperjelas, the_submoduleadalah jalur relatif dari submodule di dalam proyek. Misalnya, subdir/my_submodulejika submodule berada di dalam subdirektori subdir.

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:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
tinlyx
sumber
5
Saya menggunakan git versi 2.4.9 (Apple Git-60) dan yang harus saya lakukan adalah rm the_submodule. Saya mendorong itu kemudian menambahkan kembali folder bernama sama dengan submodule dan berfungsi tanpa masalah.
David Silva Smith
19
Ini tidak menghapus entri submodule dari .git/config. Lihat stackoverflow.com/a/36593218/1562138 untuk cara lengkap menghapus submodule.
fvgs
2
@drevicko Saya baru saja menguji ini dengan Git 2.11.1 dan saya mengamati perilaku yang sama seperti sebelumnya. git init && git submodule add <repository> && git rm <name>meninggalkan .git/configentri dan .git/modules/<name>direktori serta isinya. Mungkin Anda tidak menginisialisasi submodule sebelum menghapusnya?
fvgs
2
saya merasa lebih aman menjalankan ini terlebih dahulu .. git submodule deinit -f the_submodule
danday74
1
@JarrodSmith Ya, itu jalannya. silakan lihat pembaruan.
tinlyx
478

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:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
fvgs
sumber
39
Mengapa jawaban ini memiliki sedikit upvotes? Semua jawaban populer kehilangan sesuatu, ini adalah satu-satunya yang benar-benar menghilangkan semua jejak submodule, dengan cara yang paling sederhana. Dan perhatikan: urutan perintah penting.
mbdevpl
2
Untuk menanggapi pertanyaan saya sendiri: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
Thomas
5
@ mbdevpl datang 3 tahun setelah jawaban diterima, dan saya kira tidak ada yang berhasil meyakinkan OP untuk menerima yang ini
Andy
10
INI jawaban yang tidak rumit di tahun 2018?
Warren P
9
yang .gitmodules berkas masih tampaknya tidak terpengaruh menjalankan perintah ini
Fractalf
206

Langkah sederhana

  1. Hapus entri konfigurasi:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. Hapus direktori dari indeks:
    git rm --cached $submodulepath
  3. Melakukan
  4. Hapus file yang tidak digunakan:
    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 melakukannya git submodule init, itu ditambahkan ke .git/config.

Jadi jika Anda ingin menghapus modul, tetapi dapat mengembalikannya dengan cepat, maka lakukan saja ini:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

Ini adalah ide yang baik untuk dilakukan git rebase HEADpertama dan git commit pada akhirnya, jika Anda menempatkan ini dalam skrip.

Lihat juga jawaban untuk dapatkah saya membatalkan populasi suatu submisi Git? .

errordeveloper
sumber
1
Saya punya banyak submodula (dan kekacauan yang lebih besar) jadi saya harus melewati mereka untuk loop. Karena sebagian besar dari mereka di mana di bawah direktori tertentu dan output mengandung garis miring. Saya melakukan sesuatu seperti for dir in directory/*; do git rm --cached $dir; done.
Pablo Olmos de Aguilera C.
Untuk mendapatkan ini daftar yang dapat digunakan dalam skrip untuk penghapusan rekursif - 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
errordeveloper
2
untuk mendapatkan daftar modul di mana tidak ada perubahan lokal telah dibuat -git submodule | grep '^+' | cut -d' ' -f2
errordeveloper
perhatikan, saya harus memasukkan submodulenametanda kutip ganda "submodulename".. merujuk .git/configfile
muon
Sederhana. Efisien. Di 2.25.0, setelah langkah 1, Anda perlu mengatur perubahan .gitmodules sebelum langkah 2.
Michel Donais
83

Selain rekomendasi, saya juga harus rm -Rf .git/modules/path/to/submoduledapat menambahkan submodule baru dengan nama yang sama (dalam kasus saya, saya mengganti garpu dengan yang asli)

Mark Cheverton
sumber
1
Saya juga mengalami masalah dengan ini. Jika Anda mencoba menginstal ulang submodule ke jalur yang sama, itu menyimpan info cabang di-cache di lokasi yang Anda sebutkan yang mengacaukan segalanya.
jangosteve
Terima kasih, saya butuh ini juga. @Anton, saya setuju, dan saya sudah mengedit jawaban yang dipilih untuk menambahkan info ini.
William Denniss
Saya menggunakan opsi --name untuk membuat pekerjaan pengganti ... lihat stackoverflow.com/questions/14404704/…
joseph.hainline
60

Untuk menghapus submodule yang ditambahkan menggunakan:

git submodule add [email protected]:repos/blah.git lib/blah

Lari:

git rm lib/blah

Itu dia.

Untuk versi lama git (sekitar ~ 1.8.5) gunakan:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
Doug
sumber
1
+1 memang. Ini adalah satu-satunya jawaban yang benar dari git 1.8.3 dan selanjutnya. Harus diterima sebagai yang benar.
Xananax
6
git rmmasih meninggalkan barang .git/modules/. (2.5.4)
Rudolf Adamkovič
1
@RudolfAdamkovic bekerja untuk saya? Perhatikan itu hanya menghapus entri submodule jika jalur yang tepat cocok; jika Anda telah memindahkan submodule dan kemudian menggunakannya git rmtidak; 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.
Doug
2
Jawaban ini tidak sepenuhnya benar. git rmmeninggalkan barang-barang di .git/modules/dir dan .git/configfile (ubuntu, git 2.7.4). Jawaban lain berfungsi 100%: stackoverflow.com/a/36593218/4973698
mbdevpl
50

Anda harus menghapus entri di .gitmodulesdan .git/config, dan menghapus direktori modul dari riwayat:

git rm --cached path/to/submodule

Jika Anda akan menulis di milis git, mungkin seseorang akan melakukan skrip shell untuk Anda.

Carmine Paolino
sumber
Tidak perlu untuk skrip shell, jawaban lain memiliki perintah untuk menghapus semua jejak submodule: stackoverflow.com/a/36593218/4973698
mbdevpl
42

Anda dapat menggunakan alias untuk mengotomatiskan solusi yang disediakan oleh orang lain:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Masukkan itu di git config Anda, dan kemudian Anda bisa melakukannya: git rms path/to/submodule

Charles
sumber
-1 karena ini jelas terlalu salah. PERTAMA: Ini mengasumsikan bahwa nama dan jalur submodul adalah identik yang paling sering tidak demikian . Yaitu 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. gitalias harus bekerja di mana saja di meja kerja (atau gagal dengan anggun). KETIGA: git config -f .git/configgagal dalam submodul, seperti .gitbiasanya ada file di sana.
Tino
42

Singkatnya, inilah yang harus Anda lakukan:

  1. Setel path_to_submodulevar (tanpa trailing slash):

    path_to_submodule=path/to/submodule

  2. Hapus baris yang relevan dari file .gitmodules:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. Hapus bagian yang relevan dari .git / config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Hapus tahapan dan hapus hanya $ path_to_submodule dari indeks (untuk mencegah kehilangan informasi)

    git rm --cached $path_to_submodule

  5. Lacak perubahan yang dilakukan pada .gitmodules

    git add .gitmodules

  6. Komit proyek super

    git commit -m "Remove submodule submodule_name"

  7. Hapus file submodule yang sekarang tidak dilacak

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

Luissquall
sumber
jadi semua orang yang menarik perubahan saya harus menjalankan rm -rf $ path_to_submodule rm -rf .git / modules / $ path_to_submodule untuk menghapus cache submodule?
j2emanue
Saya sarankan untuk memperbarui 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
luissquall
40

Jika submodule ditambahkan secara tidak sengaja karena Anda menambahkan, berkomitmen, dan mendorong folder yang sudah menjadi repositori Git (berisi .git), Anda tidak akan memiliki .gitmodulesfile untuk diedit, atau apa pun di dalamnya .git/config. Dalam hal ini yang Anda butuhkan adalah:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW , saya juga menghapus .gitfolder sebelum melakukan git add.

Oli Studholme
sumber
persis kasus saya
zhekaus
37

Saya menemukan deinitkarya yang bagus untuk saya:

git submodule deinit <submodule-name>    
git rm <submodule-name>

Dari git docs :

deinit

Hapus registrasi submodules yang diberikan, yaitu menghapus seluruh submodule.$name bagian dari .git / config bersama dengan pohon kerjanya.

Damjan Pavlica
sumber
Setuju menemukan solusi yang sama. Ini cara terbaik hari ini di 2018)
woto
1
itu tidak menghapus .git / modules / ... Anda harus menghapusnya, lihat jawabannya oleh @fvgs
Vilém Kurz
Tidak tahu mengapa solusi sederhana dan mudah ini bukan nomor 1
Marc Magon
AFAICS ini tampaknya menjadi jawaban yang paling paling aman untuk lebih baru gits yang tahu deinit, sebagai jawaban lain menghapus .git/modules/submoduledirektori terlalu dini, yang tampaknya membuat lebih baru gits gagal sekarang atau kemudian. Juga (lihat komentar saya di sana) menghapus .git/modules/submodulemungkin jalan yang salah, jadi ini adalah langkah berbahaya, sebaiknya diambil nanti hanya ketika gitmengeluh (atau jika Anda yakin 299% ini apa yang Anda inginkan, adalah jalur yang benar dan benar-benar dibutuhkan).
Tino
Saya juga perlu git commitmelakukan perubahan bertahap dalam direktori kerja: modified .gitmodulesdan deleted <submodule-path>.
Yuriy Pozniak
20

Setelah bereksperimen dengan semua jawaban berbeda di situs ini, saya berakhir dengan solusi ini:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

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.

git submodule add $giturl test
aboveScript test

Ini membuat Anda checkout bersih tanpa perubahan untuk melakukan.

Ini diuji dengan:

$ git --version
git version 1.9.3 (Apple Git-50)
udondan
sumber
Mengapa Anda menggunakan git rm --cached $pathitu rm -rf $pathalih-alih git rm -r $path?
bfontaine
-1 Tidak berfungsi jika Anda mencoba menghapus submodule di dalam submodule (submodule dapat membentuk pohon!). Juga ini berbahaya kereta karena tidak ada penawaran! Contoh git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'-> ketika Anda mencoba menghapus 'berbahaya .. submodul' dengan skrip Anda, wasiat ini rm -rf ..yang kemungkinan besar tidak seperti yang Anda inginkan ..
Tino
17

Apa yang saya lakukan saat ini Desember 2012 (menggabungkan sebagian besar jawaban ini):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
Lance Bergegas
sumber
15

Inilah yang saya lakukan:

1.) Hapus bagian yang relevan dari file .gitmodules. Anda dapat menggunakan perintah di bawah ini:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Tahap .gitmodulesperubahan

git add .gitmodules

3.) Hapus bagian yang relevan dari .git/config. Anda dapat menggunakan perintah di bawah ini:

git submodule deinit -f "submodule_name"

4.) Hapus gitlink (tanpa garis miring):

git rm --cached path_to_submodule

5.) Bersihkan .git/modules:

rm -rf .git/modules/path_to_submodule

6.) Berkomitmen:

git commit -m "Removed submodule <name>"

7.) Hapus file submodule yang sekarang tidak dilacak

rm -rf path_to_submodule
Ishan Liyanage
sumber
Terima kasih untuk ini. Bagi saya, saya harus mengatur ulang urutan tiga langkah pertama menjadi 3), 1), 2). Melakukan 1) memberi pertama fatal: no submodule mapping found in .gitmodules for path 'submodule_name'pada langkah 3. Namun kedua langkah itu perlu. (git v2.8.2)
U007D
13

Baru-baru ini saya menemukan proyek git yang mencakup banyak perintah terkait git yang berguna: https://github.com/visionmedia/git-extras

Instal dan ketik:

git-delete-submodule submodule

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

Chien-Wei Huang
sumber
Anda dapat menyebutnya sebagai git delete-submodule, sebagaimana git-extrasharus berada di jalur untuk bekerja. Juga perhatikan bahwa saya sarankan untuk tidak menggunakangit-extras , karena banyak bagian yang sangat buggy dan berbahaya . IE git-delete-submodulemungkin 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-extrasmungkin 99% membantu, tapi tolong jangan mengeluh jika ada yang salah menggunakannya. ANDA TELAH DIPERINGATKAN!
Tino
10

Saya harus mengambil langkah John Douthat selangkah lebih maju dan cdmasuk ke direktori submodule, dan kemudian menghapus repositori Git:

cd submodule
rm -fr .git

Lalu saya bisa mengkomit file sebagai bagian dari repositori induk Git tanpa referensi lama ke submodule.

Kyle Clegg
sumber
Saya harus melakukan ini juga untuk melewati kesalahan "fatal: Not a git repository:" ketika mencoba melakukan git rm --cachelangkah tersebut.
RickDT
9

Inilah 4 langkah yang menurut saya perlu atau berguna (yang penting dulu):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

Secara teori , git rmpada 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 submoduleperintah tampaknya bekerja.

Langkah 3 menghapus bagian the_submoduledalam 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 digunakan git config -f .git/config --remove-section. Menurut dokumentasi git-submodule , git deinit:

Unregister submodul diberikan ... Jika Anda benar-benar ingin menghapus submodule dari repositori dan berkomitmen bahwa penggunaan git-rm [1] sebagai gantinya .

Last but not least, jika tidak git commit, Anda akan / mungkin mendapatkan kesalahan saat melakukan git submodule summary(pada git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

Ini terlepas dari apakah Anda melakukan langkah 2 atau 3.

laser
sumber
7
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

sumber
7

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

Stephen J
sumber
Ini.gitmodules
Arialdo Martini
7

Dengan git 2.17 ke atas, itu hanya:

git submodule deinit -f {module_name}
git add {module_name}
git commit
Albert Tobac
sumber
Tidak berhasil, baik untuk git 2.17.1maupun git 2.20.1. Namun menggunakan git rmalih-alih git addbekerja untuk keduanya. Catatan: -ftidak diperlukan jika semuanya bersih. Pastikan untuk tidak pernah menggunakan opsi dengan gitjika 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 karena gitmencetak yang benar (!) Membantu bagaimana melanjutkan jika ada sesuatu yang diblokir karena ini.
Tino
4

Jika Anda baru saja menambahkan submodule, dan misalnya, Anda cukup menambahkan submodule yang salah atau Anda menambahkannya ke tempat yang salah, cukup lakukan git stashkemudian hapus folder tersebut. Ini dengan asumsi bahwa menambahkan submodule adalah satu-satunya yang Anda lakukan dalam repo baru-baru ini.

botbot
sumber
3

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 gitversi 2.17dan di atasnya untuk menyingkirkan submodule :

submodule="path/to/sub"              # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
  • Jika ini tidak berhasil untuk Anda, lihat di bawah.
  • Tidak ada opsi. Tidak ada yang berbahaya. Dan bahkan tidak mempertimbangkan untuk berbuat lebih banyak!
  • Diuji dengan Debian Buster 2.20.1dan Ubuntu 18.042.17.1 .
  • "$submodule" hanya untuk menekankan di mana harus meletakkan nama, dan bahwa Anda harus berhati-hati dengan spasi dan sejenisnya
  • Jika pada Windows abaikan baris pertama dan gantikan "$submodule"dengan cara Windows jalur yang ditentukan dengan benar ke submodule. (Saya bukan Windows)

Peringatan!

Jangan pernah menyentuh bagian dalam .gitdirektori sendiri! Mengedit di dalam.git memasuki sisi gelap. Jauhi semua biaya!

Dan ya, Anda bisa disalahkan gituntuk ini, karena banyak hal berguna yang hilanggit di masa lalu. Seperti cara yang tepat untuk menghapus submodula lagi.

Saya pikir ada bagian yang sangat berbahaya dalam dokumentasi git submodule. Disarankan untuk menghapus $GIT_DIR/modules/<name>/diri sendiri. Dalam pemahaman saya ini bukan hanya salah, itu sangat berbahaya dan memprovokasi sakit kepala besar di masa depan! Lihat di bawah.

Catat itu

git module deinit

adalah kebalikan langsung ke

git module init

tapi

git submodule deinit -- module
git rm -- module

juga cukup terbalik

git submodule add -- URL module
git submodule update --init --recursive -- module

karena beberapa perintah pada dasarnya perlu melakukan lebih dari satu hal:

  • git submodule deinit -- module
    • (1) pembaruan .git/config
  • git rm
    • (2) menghapus file-file modul
    • (3) dengan demikian secara rekursif menghilangkan submodul submodul
    • (4) pembaruan .gitmodules
  • git submodule add
    • menarik data ke .git/modules/NAME/
    • (1) tidak git submodule init, jadi pembaruan.git/config
    • (2) tidak git submodule update, jadi, memeriksa modul secara tidak rekursif
    • (4) pembaruan .gitmodules
  • git submodule update --init --recursive -- module
    • menarik data lebih lanjut jika diperlukan
    • (3) memeriksa submodul submodul secara rekursif

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: gitlakukan saja hal yang jelas dan lakukan itu dengan benar, dan bahkan tidak mencoba untuk berbuat lebih banyak. gitadalah 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 githal 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: AFAICS gitmengikuti jalur teknis, bukan jalur sosial. (Oleh karena itu nama pintar: git)

Jika ini gagal

Perintah di atas mungkin gagal karena hal berikut:

  • Kamu gitterlalu tua. Kemudian gunakan yang lebih baru git. (Lihat di bawah bagaimana caranya.)
  • Anda memiliki data yang tidak berkomitmen dan mungkin kehilangan data. Maka lebih baik komit dulu.
  • Submodule Anda tidak bersih dalam git cleanarti tertentu. Kemudian pertama-tama bersihkan submodule Anda menggunakan perintah itu. (Lihat di bawah.)
  • Anda telah melakukan sesuatu di masa lalu yang tidak didukung oleh git . Kemudian Anda berada di sisi gelap dan segalanya menjadi jelek dan rumit. (Mungkin menggunakan mesin lain untuk memperbaikinya.)
  • Mungkin ada lebih banyak cara untuk gagal yang tidak saya sadari (saya hanya gitpengguna-daya).

Kemungkinan perbaikan mengikuti.

Gunakan yang lebih baru git

Jika mesin Anda terlalu tua, tidak ada submodule deinitdi komputer Anda git. Jika Anda tidak ingin (atau dapat) memperbarui git, gunakan saja komputer lain dengan yang lebih baru git! gitdimaksudkan untuk didistribusikan sepenuhnya, sehingga Anda dapat menggunakan yang lain gituntuk 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
  • Sekarang lakukan hal-hal submodule
  • 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
  • Sekarang git statusbersihkan , sampai bersih kembali. Anda dapat melakukannya, karena Anda telah membersihkannya sebelumnya, berkat langkah pertama.

Ini othermachinebisa berupa VM, atau Ubuntu WSL di Windows, apa pun. Bahkan a chroot(tapi saya berasumsi bahwa Anda non-root, karena jika Anda rootharus lebih mudah untuk memperbarui ke yang lebih baru git).

Perhatikan bahwa jika Anda tidak bisa sshmasuk, ada banyak cara untuk mengangkut gitrepositori. Anda dapat menyalin worktree Anda pada beberapa stik USB (termasuk .gitdirektori), 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:

git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX

Anda dapat menggunakan multiply ini, dan ini disimpan ke dalam $HOME/.gitconfig. Sesuatu seperti

git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/

suka menulis ulang URL

https://github.com/XXX/YYY.git

ke

/mnt/usb/repo/XXX/YYY.git

Sangat mudah jika Anda mulai terbiasa dengan gitfitur canggih seperti ini.

Bersihkan dulu

Membersihkan secara manual baik, karena dengan cara ini Anda mungkin mendeteksi beberapa hal yang Anda lupa.

  • Jika git mengeluh tentang hal-hal yang belum disimpan, komit dan dorong ke tempat yang aman.
  • Jika git mengeluh tentang beberapa sisa makanan, git statusdan itu git clean -ixfdadalah temanmu
  • Cobalah untuk menjauhkan diri dari opsi ke rmdan deinitselama Anda bisa. Pilihan (seperti -f) untuk gityang baik jika Anda seorang Pro. Tetapi ketika Anda datang ke sini, Anda mungkin tidak begitu berpengalaman di submoduledaerah tersebut. Jadi lebih baik aman daripada menyesal.

Contoh:

$ git status --porcelain
 M two
$ git submodule deinit two
error: the following file has local modifications:
    two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
    md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
    tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
  NEW
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each
    5: quit                 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'

Anda lihat, tidak -fperlu submodule deinit. Jika semuanya bersih, dalam git cleanarti tertentu. Perhatikan juga bahwa git clean -xtidak diperlukan. Ini berarti git submodule deinitmenghapus 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:

mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two

Baris terakhir menampilkan kesalahan berikut:

A git directory for 'two' is found locally with remote(s):
  origin    https://github.com/hilbix/empty.git
If you want to reuse this local git directory instead of cloning again from
  https://github.com/hilbix/src.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

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

Apa yang harus dilakukan sekarang? Nah, lakukan persis seperti yang diperintahkan! Menggunakan--name someunusedname

git submodule add --name someunusedname https://github.com/hilbix/src.git two

.gitmodules maka terlihat seperti

[submodule "someunusedname"]
    path = two
    url = https://github.com/hilbix/src.git

ls -1p .git/modules/ memberi

someunusedname/
two/

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

  • Ini tidak hanya berlaku untuk Anda. Itu juga berlaku untuk semua orang lain yang menggunakan repositori Anda.
  • Dan Anda tidak kehilangan sejarah. Jika Anda lupa untuk mendorong versi terbaru dari submodule lama, Anda dapat memasukkan salinan lokal dan melakukannya nanti. Perhatikan bahwa sangat umum bahwa seseorang lupa untuk mendorong beberapa submodul (karena ini adalah PITA untuk pendatang baru, sampai mereka terbiasa git).

Namun jika Anda menghapus direktori yang di-cache, kedua pemeriksaan yang berbeda akan saling bertabrakan, karena Anda tidak akan menggunakan --nameopsi, 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 seperti git 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 seperti git bisecthampir 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 seperti git rm $module; rm -f .git/module/$moduleitu sama sekali salah! Anda harus berkonsultasi module/.gitatau .gitmodulesmenemukan hal yang benar untuk dihapus!

Jadi tidak hanya sebagian besar jawaban lain masuk ke dalam jebakan berbahaya ini, bahkan gitekstensi 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!

Dan dari sudut pandang filosofis, menghapus sejarah selalu salah! Kecuali untuk mekanika kuantum , seperti biasa, tetapi ini adalah sesuatu yang sangat berbeda.

FYI Anda mungkin dapat menebaknya: hilbix adalah akun GitHub saya.

Tino
sumber
Ensiklopedia posting ini harus dipecah menjadi bagian yang lebih jelas dengan sub judul yang lebih besar / lebih jelas untuk menunjukkan jawaban yang sebenarnya, dan bagian "pemecahan masalah" / etc yang berbeda.
Andrew
2

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

Lihat juga: Baris panduan alternatif

Rahul Dapke
sumber
Bisakah Anda memperpanjang ini dengan cara menghapus submodule mengikuti 'git submodule add' tetapi tanpa pernah melakukannya? Saya berasumsi bahwa dalam kasus itu tidak diperlukan komitmen untuk menghapus submodule, kan?
Carlo Wood
Saya pikir Anda perlu menukar git rm --cached $path_to_submoduledan git add .gitmodulestidak? Saya memang mendapatkan kesalahan pada perintah pertama: fatal: Please stage your changes to .gitmodules or stash them to proceedkarena saya memiliki perubahan unstaged untuk .gitmodules. Melakukan yang git add .gitmodulespertama menyelesaikan itu.
Carlo Wood
2

Itu mudah:

  1. Hapus bagian dari .gitmodules
  2. Panggilan: git add .gitmodules
  3. Panggilan: git submodule deinit <path to submodule>
  4. Panggilan: git rm <path to submodule>
  5. Komit dan Dorong

Anda harus menghapus file modul pada proyek Anda secara manual.

Hitam
sumber
2
Bagi saya itu sudah cukup untuk menelepon git submodule deinit <submodule_name>dan git rm <path_to_submodule>. Perintah terakhir secara otomatis menghapus entri di dalam .gitmodules. Git 2.17
Dmytro Ovdiienko
1

Saya 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 xakan menarik untuk mengetahui apakah itu berfungsi seperti pada distro linux umum juga:

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f

Techradar
sumber
0

Dalam git terbaru hanya diperlukan 4 operasi untuk menghapus submodule git.

  • Hapus entri yang sesuai di .gitmodules
  • Perubahan panggung git add .gitmodules
  • Hapus direktori submodule git rm --cached <path_to_submodule>
  • Lakukan itu git commit -m "Removed submodule xxx"
rashok
sumber
0

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 $HOMEdirektori bernama remove_submodule.sh:

#!/bin/bash

git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet

Chetabahana
sumber
0
  • Sebuah submodule dapat dihapus dengan menjalankan git rm <submodule path> && git commit. Ini bisa dibatalkan menggunakan git revert.
    • Penghapusan menghapus data pelacakan proyek super, yang merupakan entri gitlink dan bagian dalam .gitmodulesfile.
    • Direktori kerja submodule dihapus dari sistem file, tetapi direktori Git disimpan karena memungkinkan untuk checkout melewati komitmen tanpa perlu mengambil dari repositori lain.
  • Untuk benar-benar menghapus submodule, juga menghapus secara manual$GIT_DIR/modules/<name>/ .

Sumber: git help submodules

Nikhil
sumber
-1

Menghapus git submodule

Untuk menghapus gitsubmodule di bawah ini diperlukan 4 langkah.

  1. Hapus entri yang sesuai dalam .gitmodulesfile. Entri mungkin seperti yang disebutkan di bawah ini
[submodule "path_to_submodule"]
    path = path_to_submodule
    url = url_path_to_submodule
  1. Perubahan panggung git add .gitmodules
  2. Hapus direktori submodule git rm --cached <path_to_submodule>.
  3. Komit 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.

  1. Hapus entri yang sesuai dalam .git/configfile. Entri mungkin seperti yang disebutkan di bawah ini
[submodule "path_to_submodule"]
    url = url_path_to_submodule
  1. Melakukan rm -rf .git/modules/path_to_submodule

Langkah 5 dan 6 ini tidak membuat perubahan apa pun yang perlu dilakukan.

rashok
sumber
Akan jauh lebih mudah jika Anda menggunakan git submodule deinit git-scm.com/docs/git-submodule#Documentation/…
Black