Pertanyaan Bagaimana cara menghapus submodul?


Bagaimana cara menghapus submodul Git?

Ngomong-ngomong, apakah ada alasan yang tidak bisa aku lakukan

git submodule rm whatever

?


3019
2017-08-11 14:31


asal


Jawaban:


Sejak git1.8.3 (22 April 2013):

Tidak ada cara Porcelain untuk mengatakan "Saya tidak lagi tertarik pada submodul ini", setelah Anda menyatakan minat Anda pada submodul 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: Ini disebutkan dalam Daniel Schroeder's menjawab, dan diringkas oleh Eonil di komentar:

Daun ini .git/modules/<path-to-submodule>/ tidak berubah.
  Jadi, jika Anda pernah menghapus submodul 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 submodul menghilangkan pohon kerja submodule dari yang dari superproject dan gitlink dari indeks.
  Tetapi bagian submodule di .gitmodules dibiarkan tak tersentuh, yang merupakan sisa dari submodule yang sekarang dihapus dan dapat mengganggu pengguna (sebagai lawan dari pengaturan di .git/config, ini harus tetap sebagai pengingat bahwa pengguna menunjukkan ketertarikan pada submodul ini sehingga akan terisi kembali nanti ketika commit yang lebih tua diperiksa).

Biarkan "git rm"membantu pengguna dengan tidak hanya menghapus submodul dari pohon kerja tetapi juga menghapus"submodule.<submodule name>"bagian dari .gitmodules file dan panggung keduanya.


git submodule deinit: Itu berasal dari tambalan ini:

Dengan "git submodule init"Pengguna dapat mengatakan bahwa mereka peduli tentang satu atau lebih submodul dan ingin mengisinya pada panggilan berikutnya ke"git submodule update".
  Tapi saat ini tidak ada cara mudah mereka dapat mengatakan bahwa mereka tidak peduli dengan submodul lagi dan ingin menyingkirkan pohon kerja lokal (kecuali pengguna tahu banyak tentang submodul internal dan menghapus "submodule.$name.url"pengaturan dari .git/config bersama dengan pohon kerja itu sendiri).

Bantu pengguna tersebut dengan memberikan 'deinit'perintah.
  Ini menghapus keseluruhan submodule.<name> bagian dari .git/config baik untuk yang diberikan   submodule (s) (atau untuk semua yang telah diinisialisasi jika '.' diberikan).
  Gagal jika pohon kerja saat ini berisi modifikasi kecuali dipaksa.
  Mengeluh ketika untuk submodul yang diberikan pada baris perintah, pengaturan url tidak dapat ditemukan .git/config, namun tetap saja tidak gagal.

Ini perlu diperhatikan jika langkah-langkah inisialisasi (de) (.git/config dan .git/modules/xxx)

Sejak git1.8.5, yang git rm dibutuhkan juga perawatan dari:

  • 'addmsgstr "langkah yang merekam url dari submodul dalam .gitmodules file: itu perlu dihapus untuk Anda.
  • submodule entri khusus (seperti yang diilustrasikan oleh pertanyaan ini): git rm menghapusnya dari indeks:
    git rm --cached path_to_submodule(tidak ada garis miring)
    Itu akan menghapus direktori yang disimpan dalam indeks dengan mode khusus "160000", menandainya sebagai direktori root submodule.

Jika Anda lupa langkah terakhir, dan mencoba menambahkan apa yang merupakan submodul sebagai direktori reguler, 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 merupakan skrip shell.
Ini adalah panggilan ke fungsi C.

Lihat lakukan 2e61273, lakukan 1342476 (14 Jan 2018) oleh Prathamesh Chavan (pratham-pc).
(Digabung oleh Junio ​​C Hamano - gitster - di lakukan ead8dbe, 13 Feb 2018) 

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1796
2018-04-23 05:57



Melalui halaman Tutorial Submodul Git:

Untuk menghapus submodul Anda harus:

  1. Hapus bagian yang relevan dari .gitmodules mengajukan.
  2. Panggung .gitmodules perubahan git add .gitmodules
  3. Hapus bagian yang relevan dari .git/config.
  4. Menjalankan git rm --cached path_to_submodule (tidak ada garis miring).
  5. Menjalankan rm -rf .git/modules/path_to_submodule
  6. Melakukan git commit -m "Removed submodule <name>"
  7. Hapus file submodule yang sekarang tidak terlacak
    rm -rf path_to_submodule

Lihat juga: langkah-langkah alternatif di bawah ini.


3144
2018-01-18 23:30



Sekedar catatan saja. Sejak git 1.8.5.2, dua perintah akan dilakukan:

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

Sebagai jawaban @Mark Cheverton dengan benar, jika baris kedua tidak digunakan, bahkan jika Anda menghapus submodul untuk saat ini, sisa .git / modules / the_submodule folder akan mencegah submodul yang sama dari ditambahkan kembali atau diganti di masa depan . Juga, seperti yang disebut @VonC, git rm akan melakukan sebagian besar pekerjaan pada submodul.

--Perbarui (07/05/2017) -

Hanya untuk mengklarifikasi, the_submodule adalah jalur relatif dari submodul di dalam proyek. Misalnya, itu subdir/my_submodule jika submodul ada di dalam subdirektori subdir.

Seperti yang ditunjukkan dengan benar di komentar dan jawaban lainnya, dua perintah (meskipun secara fungsional cukup untuk menghapus submodul), jangan tinggalkan jejak di [submodule "the_submodule"] bagian dari .git/config (mulai Juli 2017), yang dapat dihapus menggunakan perintah ketiga:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

331
2018-04-13 08:51



Sebagian besar jawaban atas pertanyaan ini sudah ketinggalan jaman, 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 itu sendiri di repo lokal Anda. Proses untuk menghilangkan 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

244
2018-03-02 16:07



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

Tolong dicatat:  $submodulepath tidak berisi garis miring di depan atau di belakang.

Latar Belakang

Saat kamu melakukan git submodule add, itu hanya menambahnya .gitmodules, tapi begitu kamu melakukannya git submodule init, itu ditambahkan ke .git/config.

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

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

Ini adalah ide yang bagus untuk dilakukan git rebase HEAD pertama dan git commit pada akhirnya, jika Anda memasukkan ini ke dalam skrip.

Juga lihatlah jawaban untuk Dapatkah saya tidak mengisi submodul Git?.


183
2017-08-11 14:43



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


80
2017-10-12 10:17



Anda harus menghapus entri masuk .gitmodules dan .git/config, dan hapus 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.


46
2017-11-01 21:43



Untuk menghapus submodul yang ditambahkan menggunakan:

git submodule add blah@blah.com:repos/blah.git lib/blah

Menjalankan:

git rm lib/blah

Itu dia.

Untuk versi lama dari git (sekitar ~ 1.8.5) gunakan:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

45
2017-07-09 17:55



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"

Taruh itu di konfigurasi git Anda, dan kemudian Anda dapat melakukan: git rms path/to/submodule


40
2018-05-16 09:27



Untuk meringkas, inilah yang harus Anda lakukan:

  1. Set path_to_submodule var (no 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. Unstage dan hapus $ path_to_submodule hanya dari indeks (untuk mencegah hilangnya informasi)

    git rm --cached $path_to_submodule

  5. Lacak perubahan yang dibuat ke .gitmodules

    git add .gitmodules

  6. Komit proyek super

    git commit -m "Remove submodule submodule_name"

  7. Hapus file submodule yang sekarang tidak terlacak

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


38
2017-10-22 10:54