Bagaimana cara mengganti submodul git dengan repo lain?

96

Bagaimana cara mengganti submodul git dengan repo git yang berbeda?

Secara khusus, saya memiliki submodul:

  • terletak di ./ExternalFrameworks/TestFrameworktitik itu ke repo git[email protected]:userA/TestFramework.git
  • Sekarang saya ingin menunjukkannya [email protected]:userB/TestFramework.git.

Masalahnya adalah ketika saya menghapus submodule dengan metode yang dijelaskan di sini , lalu menambahkannya kembali menggunakan perintah

git submodule add [email protected]:userB/TestFramework.git

Saya mendapatkan kesalahan ini:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.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.
joseph.hainline
sumber
1
kemungkinan duplikat Mengubah repositori jarak jauh untuk submodul git
jiyinyiyong

Jawaban:

123

Jika lokasi (URL) dari submodule telah berubah, maka Anda dapat dengan mudah:

  1. Ubah .gitmodulefile Anda untuk menggunakan URL baru
  2. Hapus folder submodule di repo rm -rf .git/modules/<submodule>
  3. Hapus folder submodule di direktori kerja rm -rf <submodule>
  4. Lari git submodule sync
  5. Lari git submodule update

Info lebih lengkap dapat ditemukan di tempat lain:

Tim Henigan
sumber
4
Juga perlu diperhatikan: ketika pengguna lain (yang telah menginisi submodul) mendapatkan update Anda, mereka juga harus melakukan "git submodule sync" satu kali sebelum submodule baru bekerja untuk mereka.
joseph .hainline
2
Ini tidak berhasil untuk saya. Submodul saya masih mengarah ke URL lama setelah ini. Ada ide mengapa?
Arne
34
@Arne Mungkin submodul Anda tidak pernah diinisialisasi dengan benar. Saya harus melakukannya rm -rf .git/modules/<submodule>sebelum itu berhasil untuk saya.
David Braun
@DavidBraun Saya memiliki masalah yang sama dengan @Arne meskipun melakukan git submodule syncsetelah rm -rf .git/modules/<submodule>memberi fatal: Not a git repository: ../.git/modules/<submodule>. Ada tips? Saya awalnya membuat submodul melalui git submodule add https://<submodule-url>sesuai dengan dokumen git ...
acannon828
1
Setelah itu saya harus cd ke direktori modul, git checkout cabang yang saya inginkan, lalu git pull.
Nicolas Raoul
34

Pertama, hapus submodul saat ini dengan metode yang telah disebutkan di sini , yang saya sertakan untuk kenyamanan:

  • Hapus bagian yang relevan dari .gitmodulesfile
  • Hapus bagian yang relevan dari .git/config
  • Jalankan git rm --cached path_to_submodule(tidak ada garis miring)
  • Komit dan hapus file submodul yang sekarang tidak terlacak

Sekarang, tambahkan submodul baru dengan --namebendera. Ini akan memberi git nama alternatif untuk referensi .git/configuntuk submodul, untuk mendekonflikasikan dengan submodul yang ada di sana secara historis, yang masih ingin Anda kerjakan di riwayat sebelumnya.

Jadi ketik:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

dan Anda akan mendapatkan submodul dimuat di jalur yang Anda harapkan.

joseph.hainline
sumber
2
Meskipun cara ini berhasil, metode ini tidak sebersih metode Tim.
joseph.hainline
4
Ini berhasil untuk saya tetapi saya juga harus menghapus .git/modules/<path_to_submodule>.
Nate
1
Hargai referensi untuk --name. Saya tidak mengetahui masalah seputar ini, dan saya tidak dapat mengganti submodule sampai saya menggunakan opsi ini (terima kasih atas jawaban Anda).
aknuds1
Ini menjadi satu-satunya metode yang berhasil untuk saya, namun saya ingin tetap menggunakan nama direktori yang sama. Itu melakukan checkout jalur yang benar dan membuat nama modul menjadi nama yang diinginkan tetapi nama direktori kerja adalah nama repo baru. Jadi, jika Anda menginginkan nama yang sama, Anda juga perlu menentukannya di akhir url seperti: git submodule add --name old-name-to-keep [email protected]:userB/new-repository.git old-name-to-keep
rgb
8

Perintah ini akan bekerja pada command prompt tanpa mengubah file apa pun di repositori lokal.

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote
Pavan Sokke Nagaraj
sumber
5

Apa yang memperbaiki ini untuk saya adalah di root repo git Anda (bukan submodul), jalankan

rm -rf .git/modules/yourmodule

Maka Anda harus bisa menambahkan seperti biasa.

hobberwickey
sumber
3

Cara termudah yang saya temukan adalah ini:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Saya tidak suka ide untuk memodifikasi .gitmodulesmanual saya . Saya juga menulis sedikit posting blog tentang itu.

DerZyklop
sumber
2

Jika Anda ingin mengubah URL jarak jauh hanya untuk klon ini :

git config submodule."$submodule_name".url "$new_url"

Ini tidak akan memengaruhi .gitmodulesfile di proyek induk, jadi tidak akan disebarkan ke pengembang lain.

Ini dijelaskan sebagai "perubahan data khusus pengguna" di sini .

Jangan dijalankangit submodule synckarena itu akan mengatur ulang ke URL default lagi.

joeytwiddle
sumber