Bagaimana cara saat ini untuk menghapus submodul git?

91

mulai git versi 1.9.3 (Apple Git-50) di mac bagaimana cara menghapus submodul git? Saya membaca banyak informasi usang dengan banyak pengembang memberi tahu saya bahwa mereka tidak akan berfungsi. Bagaimana cara saat ini? akan git deinit pathToSubModule melakukan triknya?

Langkah-langkah yang saya pikir akan berhasil ada di sini tetapi komentar mengatakan mereka tidak akan berhasil.

Izinkan saya menjelaskan situasi saya saat ini dan apa yang perlu saya capai. Saya telah menginstal repositori Cepat dan menambahkannya sebagai submodul ke proyek saya. Kode ini sudah diperiksa dan orang lain sedang menggunakannya. Apa yang sekarang perlu saya lakukan adalah membagi repositori Cepat yang sama dan menyimpannya di github yang lebih aman yang dimiliki perusahaan saya (jadi github pribadi yang sepenuhnya lain). Setelah bercabang, saya ingin menambahkan garpu itu sebagai gitSubmodule dan membiarkannya menggantikan submodul Cepat saat ini yang telah saya instal sebelumnya.

update: Saya telah membaca bahwa berikut ini adalah cara yang benar pada versi git terbaru, harap konfirmasi?

To remove a submodule added using:

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

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
j2emanue
sumber
Saya telah bergumul dengan masalah submodul 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 berisi '~'. Setelah saya mengubah ssh: //[email protected]/~/git/MyRepo.git ke ssh: //[email protected]/home/username/git/MyRepo.git (lihat jalur sebenarnya di server Anda), semua keanehan menghilang dalam sepuluh menit.
Elise van Looij

Jawaban:

193

Kamu punya git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Batalkan pendaftaran submodul yang diberikan, yaitu hapus seluruhsubmodule.$name
bagian .git/configbersama-sama dengan pohon kerjanya.

Panggilan lebih lanjut ke git submodule update, git submodule foreachdan git submodule syncakan melewati submodul yang tidak terdaftar sampai mereka diinisialisasi lagi, jadi gunakan perintah ini jika Anda tidak ingin melakukan checkout lokal submodule di pohon kerja Anda lagi.

Jika Anda benar-benar ingin menghapus submodul dari repositori dan mengkomit penggunaan itu git rmsebagai gantinya.

Jika --forceditentukan, pohon kerja submodul akan dihapus meskipun berisi modifikasi lokal.

CodeWizard
sumber
8
saya ingin sepenuhnya menghapus submodul untuk saya dan pengguna lain juga. Jadi yang saya butuhkan hanyalah git submodule deinit asubmodule; dan git rm asubmodule ?? Juga bagaimana dengan submodul cache pengguna lain, apakah mereka harus menghapusnya setelah menarik ke bawah?
j2emanue
1
Saya ingin menghapus salinan lokal submodule dan ini berfungsi dengan sempurna, semua file di subdir hilang.
malhal
1
Anda mungkin juga perlu rm -rf <asubmodule>jika Anda sudah memeriksa versi repositori dasar yang telah membatalkan pendaftaran submodul.
Sarah Messer
6

Saya menggunakan Git versi 2.16.2 dan git rmmelakukan sebagian besar pekerjaan dengan baik:

git rm path-to-submodule

Anda dapat memverifikasi dengan git statusdan git diff --cachedbahwa ini membatalkan inisialisasi submodul dan mengubah .gitmodulessecara otomatis. Seperti biasa, Anda perlu melakukan perubahan.

Namun, meskipun submodule dihapus dari kontrol sumber, .git/modules/path-to-submodulemasih berisi repositori submodul dan .git/configberisi URL-nya, jadi Anda masih harus menghapusnya secara manual:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Menyimpan repositori dan konfigurasi submodule disengaja sehingga Anda dapat membatalkan penghapusan dengan mis git reset --hard.

mrts
sumber
1
jawaban terbaru dan solusi terpendek
TurboGuma
3

Cara menghapus submodul dengan aman.

(menambahkan ke https://stackoverflow.com/a/1260982/342794 )

  1. Buat daftar dan cari bagian submodule dalam .gitmodulesfile. Ucapkan melalui terminal vi .gitmodules. Contoh:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. Submodul dapat digunakan dengan garpu lokal. Untuk proyek yang berjalan lama, kode mungkin berbeda dari repo asli dan mungkin ada beberapa perbaikan. Sebaiknya verifikasi apakah kode submodule mengalami perubahan selama proyek berlangsung. Contoh: Lihat log, jika mengarah ke mastercabang atau cabang lokal. menjelajahi log git untuk menemukan modifikasi yang dilakukan melalui terminal. biasanya ini disimpan di bawah direktori, contoh saya, di bawah submodulesdirektori.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Hapus bagian submodule dari .gitmodules, simpan file. Contoh: git statusharus menampilkan hanya yang berikut sebagai diubah

    modified:   .gitmodules
    
  4. Panggung perubahan dengan git add .gitmodules.

  5. Buat daftar dan temukan bagian submodule dalam .git/configfile. Ucapkan melalui terminal vi .git/config. Contoh:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Hapus file sobmodule git cache. berjalan git rm --cached submodules/afnetworking(tanpa garis miring) akan berhasil menghapusnya. Contoh:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Hapus file submodule di bawah .gitdirektori dengan rm -rf .git/modules/.... Konfirmasikan dengan git statussetelahnya.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Lakukan perubahan. Konfirmasikan dengan git statussetelahnya.

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Hapus file submodul yang tidak terlacak.

    User$ rm -rf submodules/afnetworking
    
  10. Hapus referensi dari proyek Xcode. Buat, perbaiki masalah kompilasi dan runtime.

lal
sumber