Come modificare il repository remoto per un sottomodulo git?


724

Ho creato un repository git con al suo interno un sottomodulo. Sono in grado di dire al sottomodulo stesso di modificare il percorso del repository remoto, ma non sono sicuro di come dire al repository padre come modificare il percorso del repository remoto per il sottomodulo.

Non sarei sorpreso se sono un po 'sfortunato e devo fare le cose manualmente, poiché anche eliminare i sottomoduli non è facile.


8
Nota: Git 2.25 (Q1 2020) viene fornito con un nuovo comando ":git submodule set-url [--] <path> <newurl>
VonC

Risposte:


1010

Dovresti solo essere in grado di modificare il .gitmodulesfile per aggiornare l'URL e quindi eseguirlo git submodule syncper riflettere quella modifica al superprogetto e alla tua copia di lavoro.


22
Questo non sembra aggiornare .git / config, almeno in 1.7.1 o 1.7.3.
davidtbernal,

6
aggiorna anche la configurazione dell'URL del sottomodulo per i commit precedenti? ad esempio se eseguo il checkout di un commit precedente, punterà a nuovi URL di sottomodulo?
maxmelbin,

63
Utilizzalo git submodule foreach -q git config remote.origin.urlper vedere gli URL del sottomodulo "reali"
Joel Purra,

10
Non è stato aggiornato .git/configper me usando git 2.1.0. Ho dovuto aggiornare entrambi .gitmodulese .git/configmanualmente prima di eseguire un git submodule sync --recursiveper aggiornare il mio sottomodulo remoto.
Desseim,

7
Questo sembra mancare il passaggio chiave di git submodule update --init --recursive --remotecui in realtà cambia il repository con il nuovo telecomando
Jason Axelson,

155

Questi comandi eseguiranno il lavoro sul prompt dei comandi senza alterare alcun file nel repository locale

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

Consulta il blog per gli screenshot: modifica dell'URL dei sottomoduli GIT / Branch in altri URL / branch dello stesso repository


8
Funzionava, ma dovevo ricordare di inviare le modifiche al telecomando. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00,

5
Bene, questo ha creato un disastro terribile per me. I comandi sono scesi silenziosamente, ma il repository del sottomodulo attuale pensa ancora che il suo telecomando sia quello vecchio (il vecchio URL). Forse questi comandi dovrebbero essere accompagnati da altri comandi all'interno del repository del sottomodulo?
Motti Shneor,

5
L'ultimo comando è un po 'estremo ... Se hai dei sottomoduli con sottomoduli all'interno, questo aggiornerà anche i sottomoduli in remoto, il che è improbabile che ti serva.
Baptiste Wicht,

7
Nota che devi sostituire Submod con il nome del tuo sottomodulo!
Shital Shah,

133

In termini semplici, devi solo modificare il file .gitmodules, quindi risincronizzare e aggiornare:

Modifica il file, tramite un comando git o direttamente:

git config --file=.gitmodules -e

o semplicemente:

vim .gitmodules

quindi risincronizza e aggiorna:

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --initha funzionato per me, --remotesembra collegarlo alla TESTA del repository remoto.
Chaim Eliyah,

96

Con Git 2.25 (Q1 2020), puoi modificarlo .
Vedi "L' URL del sottomodulo di Git è cambiato " e il nuovo comando

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

Risposta originale (maggio 2009, dieci anni fa)

In realtà, nell'aprile 2009 è stata presentata una patch per chiariregitmodule ruolo.

Quindi ora la documentazione di gitmodule non include ancora:

Il .gitmodulesfile, situato nella directory di livello superiore di un albero di lavoro git, è un file di testo con una sintassi che soddisfa i requisiti di linkgit: git-config 1 .
[NOVITÀ]:
poiché questo file è gestito da Git, tiene traccia dei record + dei sottomoduli di un progetto.
Le informazioni memorizzate in questo file vengono utilizzate come suggerimento per adescare la versione autorevole del record memorizzato nel file di configurazione del progetto.
Le modifiche al record specifiche dell'utente (ad es. Per tenere conto delle differenze negli URL del sottomodulo dovute a situazioni di rete) dovrebbero essere apportate al file di configurazione, mentre le modifiche al record da propagare (ad es. + A causa di una delocalizzazione dell'origine del sottomodulo) dovrebbero essere apportate a questo file .

Questo praticamente conferma la risposta di Jim .


Se segui questo tutorial del sottomodulo git , vedi che hai bisogno di un "git submodule init " per aggiungere gli URL del repository del sottomodulo a .git / config.

" git submodule sync" è stato aggiunto nell'agosto 2008 proprio per semplificare tale compito quando l'URL cambia (specialmente se il numero di sottomoduli è importante).
Lo script associato con quel comando è abbastanza semplice:

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

L'obiettivo rimane: git config remote."$remote".url "$url"


Volevo cambiare l'URL del sottomodulo solo su questa macchina. Dal progetto genitore ho potuto modificare il record .git/configfacendo: git config submodule."$submodule_name".url "$new_url" che è anche descritto qui .
joeytwiddle,

Cosa fanno i doppi trattini opzionali git submodule set-url [--] <path> <newurl>?
gioviale

1
@jeverling Aiutano opzioni separate da parametri: vedi stackoverflow.com/a/1192194/6309
VonC

1
Si noti che per gli utenti Ubuntu con una versione precedente di git è possibile utilizzare questo PPA per l'aggiornamento: launchpad.net/~git-core/+archive/ubuntu/ppa
starbeamrainbowlabs

69

Cosa ha funzionato per me (su Windows, usando la versione 1.8.3.msysgit.0 di git):

  • Aggiorna .gitmodules con il percorso al nuovo repository
  • Rimuovere la riga corrispondente dal file ".git / config"
  • Elimina la directory corrispondente nella directory ".git / modules / external"
  • Elimina la directory del sottomodulo estratta stessa (non sei sicuro che ciò sia necessario)
  • Correre git submodule init egit submodule update
  • Assicurati che il sottomodulo estratto sia nel commit corretto e esegui il commit, poiché è probabile che l'hash sia diverso

Dopo aver fatto tutto ciò, tutto è nello stato che mi aspetterei. Immagino che altri utenti del repository avranno dolori simili quando verranno ad aggiornarsi - sarebbe saggio spiegare questi passaggi nel tuo messaggio di commit!


2
Grazie mille per questo. Questo è l'unico che ha funzionato per me dopo che avevo già eseguito un git submodule update. Seguire le altre risposte non cambierebbe ciò che era nella ./git/modules/externaldirectory, quindi il tentativo di aggiornamento comporterebbe comunque l'estrazione dell'URL errato.
Ntsc Cobalt,

questo sembra essere un po 'pericoloso, e non sono sicuro che preservi la storia del sottomodulo precedente. Se, ad esempio, vuoi verificare un vecchio commit o ramo del tuo repository principale (quello che contiene il sottomodulo) non sono sicuro che saprà tirare il vecchio sottomodulo allegato e correlato a quel vecchio commit del principale .
Motti Shneor,

No, quasi sicuramente non lo saprà: dovrai ripetere tutti i passaggi dopo il primo. Questo è proprio quello che ho trovato funzionante per oscurare lo stato corrente del sottomodulo. Non so se lo stato delle cose sia cambiato da quando l'ho scritto, mente :)
Ben Hymers,

@MottiShneor sembra davvero pericoloso se devi conservare la cronologia del sottomodulo precedente, anche se non ne sono sicuro. Nel mio caso è l'unica soluzione che ha funzionato, quello che volevo era sostanzialmente sostituire il sottomodulo originale con la mia forcella
Arainone,

1
Seguito questi passaggi e trovato che "Elimina la stessa directory del sottomodulo estratta (incerto se è necessario)" è necessario altrimenti si verificherà "fatale: non un repository git: ..." durante l'esecuzione dell'aggiornamento del sottomodule git
PiersyP

10

Modifica il tuo file .git / config . Per esempio; se hai un sottomodulo "comune" puoi farlo nel super-modulo:

git config submodule.common.url /data/my_local_common

Questo è solo il modo migliore se stai provando a cambiare l'URL per un solo utilizzo, non in modo permanente nel super progetto. Ad esempio, si desidera clonare sottomoduli da copie locali su disco.
Andy,

4

git config --file=.gitmodules -e apre l'editor predefinito in cui è possibile aggiornare il percorso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.