Bagaimana cara mengubah repositori jarak jauh untuk submodule git?

724

Saya telah membuat repositori git dengan submodule di dalamnya. Saya bisa memberi tahu submodule itu sendiri untuk mengubah jalur repositori jarak jauh, tapi saya tidak yakin bagaimana cara memberitahu repositori induk cara mengubah jalur repositori jauh untuk submodule.

Saya tidak akan terkejut jika saya agak kurang beruntung dan harus melakukan hal-hal secara manual, karena bahkan menghapus submodul tidak mudah.

Andrew Grimm
sumber
8
Catatan: Git 2.25 (Q1 2020) hadir dengan perintah baru ":git submodule set-url [--] <path> <newurl>
VonC

Jawaban:

1010

Anda seharusnya bisa mengedit .gitmodulesfile untuk memperbarui URL dan kemudian menjalankan git submodule syncuntuk mencerminkan perubahan itu ke proyek super dan copy pekerjaan Anda.

Jim Puls
sumber
22
Ini tampaknya tidak memperbarui .git / config, setidaknya di 1.7.1 atau 1.7.3.
davidtbernal
6
apakah ini memperbarui konfigurasi url submodule untuk komit sebelumnya juga? ex jika saya checkout komit yang lebih lama, apakah ini akan mengarah ke url submodule baru?
maxmelbin
63
Gunakan git submodule foreach -q git config remote.origin.urluntuk melihat url submodule "aktual"
Joel Purra
10
Itu tidak diperbarui .git/configuntuk saya menggunakan git 2.1.0. Saya harus memperbarui keduanya .gitmodulesdan .git/configsecara manual sebelum menjalankan git submodule sync --recursiveagar remote submodule saya diperbarui.
desseim
7
Tampaknya ini kehilangan langkah kunci git submodule update --init --recursive --remoteyang sebenarnya mengubah repositori ke remote baru
Jason Axelson
155

Perintah-perintah ini akan bekerja pada command prompt tanpa mengubah file apa pun pada repositori lokal

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

Silakan lihat blog untuk tangkapan layar: Mengubah URL / Cabang submittules GIT ke URL / cabang lain dari repositori yang sama

Pavan Sokke Nagaraj
sumber
8
Ini berhasil tetapi saya harus ingat untuk mendorong perubahan ke remote. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00
5
Nah, itu menciptakan kekacauan yang mengerikan bagi saya. Perintah-perintah turun dengan pelan, tetapi repositori submodule yang sebenarnya masih menganggap remote-nya adalah yang lama (URL yang lama). Mungkin perintah-perintah ini harus disertai dengan perintah lain dalam repositori submodule?
Motti Shneor
5
Perintah terakhir agak ekstrem ... Jika Anda memiliki submodul dengan submodul di dalamnya, ini juga akan memperbarui sub-submodul dari jarak jauh, yang sepertinya tidak Anda butuhkan.
Baptiste Wicht
7
Perhatikan bahwa Anda perlu mengganti Submod dengan nama submodule Anda!
Shital Shah
133

Secara sederhana, Anda hanya perlu mengedit file .gitmodules, kemudian menyinkronkan ulang dan memperbarui:

Edit file, baik melalui perintah git atau langsung:

git config --file=.gitmodules -e

atau hanya:

vim .gitmodules

kemudian sinkronisasi ulang dan perbarui:

git submodule sync
git submodule update --init --recursive --remote
Matthew Wilcoxson
sumber
6
git submodule update --initbekerja untuk saya, --remotetampaknya mengikatnya dengan KEPALA repo jarak jauh.
Chaim Eliyah
96

Dengan Git 2.25 (Q1 2020), Anda dapat memodifikasinya .
Lihat " Git submodule url berubah " dan perintah baru

git submodule set-url [--] <path> <newurl>

Jawaban asli (Mei 2009, sepuluh tahun lalu)

Sebenarnya, tambalan telah diserahkan pada April 2009 untuk memperjelas gitmoduleperan.

Jadi sekarang dokumentasi gitmodule belum termasuk:

The .gitmodulesberkas, terletak di direktori tingkat atas dari pohon kerja git, adalah file teks dengan sintaks yang cocok dengan persyaratan -dari linkgit: git-config 1 .
[BARU]:
Karena file ini dikelola oleh Git, ia melacak + catatan submodul proyek.
Informasi yang disimpan dalam file ini digunakan sebagai petunjuk untuk melengkapi versi otoritatif dari catatan yang disimpan dalam file konfigurasi proyek.
Perubahan catatan khusus pengguna (mis. Untuk memperhitungkan perbedaan dalam URL submodul karena situasi jaringan) harus dibuat ke file konfigurasi, sementara catatan perubahan harus diperbanyak (mis. + Karena relokasi sumber submodule) harus dilakukan pada file ini .

Itu cukup mengkonfirmasi jawaban Jim .


Jika Anda mengikuti tutorial submodule git ini , Anda perlu " git submodule init" menambahkan URL repositori submodule ke .git / config.

" git submodule sync" telah ditambahkan pada Agustus 2008 tepatnya untuk mempermudah tugas itu ketika URL berubah (terutama jika jumlah submodul penting).
Skrip associate dengan perintah itu cukup mudah:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

Tujuannya tetap: git config remote."$remote".url "$url"

VONC
sumber
Saya ingin mengubah URL submodule hanya di mesin ini. Dari proyek induk saya dapat memodifikasi catatan .git/configdengan melakukan: git config submodule."$submodule_name".url "$new_url" yang juga dijelaskan di sini .
joeytwiddle
Apa yang dilakukan tanda hubung ganda opsional git submodule set-url [--] <path> <newurl>?
jeverling
1
@jeverling Mereka membantu memisahkan opsi dari parameter: lihat stackoverflow.com/a/1192194/6309
VonC
1
Perhatikan bahwa untuk pengguna Ubuntu dengan git versi yang lebih lama, Anda dapat menggunakan PPA ini untuk memperbarui: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs
69

Apa yang berhasil untuk saya (di Windows, menggunakan git versi 1.8.3.msysgit.0):

  • Perbarui .gitmodules dengan jalur ke repositori baru
  • Hapus baris yang sesuai dari file ".git / config"
  • Hapus direktori yang sesuai di direktori ".git / modules / eksternal"
  • Hapus direktori submodule yang sudah diperiksa sendiri (tidak yakin apakah ini perlu)
  • Jalankan git submodule initdangit submodule update
  • Pastikan submodule yang diperiksa berada di komit yang benar, dan komit itu, karena kemungkinan hash akan berbeda

Setelah melakukan semua itu, semuanya dalam keadaan yang saya harapkan. Saya membayangkan pengguna repositori lain akan memiliki rasa sakit yang sama ketika mereka datang untuk memperbarui - akan lebih bijaksana untuk menjelaskan langkah-langkah ini dalam pesan komit Anda!

Ben Hymers
sumber
2
Terima kasih banyak atas ini. Ini adalah satu-satunya yang bekerja untuk saya setelah saya sudah menjalankan git submodule update. Mengikuti jawaban lain tidak akan mengubah apa yang ada di ./git/modules/externaldir jadi berusaha memperbarui akan menghasilkan url yang salah.
NtscCobalt
ini tampaknya agak berbahaya, dan saya tidak yakin itu mempertahankan sejarah submodule sebelumnya. Jika, misalnya, Anda ingin memeriksa komit lama atau cabang repositori utama Anda (yang berisi submodule), saya tidak yakin itu akan tahu untuk menarik submodule LAMA terlampir dan terkait dengan komit lama main utama .
Motti Shneor
Tidak, hampir pasti tidak akan tahu - Anda harus melakukan semua langkah setelah yang pertama lagi. Ini hanya apa yang saya temukan bekerja untuk nuking keadaan submodule saat ini. Saya tidak tahu apakah keadaan telah berubah sejak saya menulis ini, ingat :)
Ben Hymers
@MottiShneor yang tampaknya berbahaya memang jika Anda perlu menyimpan riwayat submodule sebelumnya, meskipun saya tidak yakin tentang hal itu. Dalam kasus saya itu satu-satunya solusi yang berhasil, yang saya inginkan pada dasarnya adalah mengganti submodule asli dengan garpu saya sendiri
arainone
1
Ikuti langkah-langkah ini dan temukan bahwa "Hapus direktori submodule yang diperiksa sendiri (tidak yakin jika ini diperlukan)" diperlukan jika tidak Anda akan menjumpai "fatal: Bukan repositori git: ..." ketika menjalankan pembaruan submodule git
PiersyP
10

Cukup edit file .git / config Anda . Sebagai contoh; jika Anda memiliki submodule "umum" Anda dapat melakukan ini di super-module:

git config submodule.common.url /data/my_local_common
FelipeC
sumber
Ini hanya cara terbaik jika Anda mencoba mengubah URL untuk sekali pakai, tidak secara permanen di proyek super. Misalnya Anda ingin mengkloning submodul dari salinan lokal pada disk.
Andy
4

git config --file=.gitmodules -e membuka editor default di mana Anda dapat memperbarui jalur

LuGo
sumber