2009-05-27 18 views
477

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

Non sarei sorpreso se sono un po 'sfortunato e devo fare le cose manualmente, come anche i sottomoduli deleting non sono facili.

risposta

711

Dovresti essere in grado di modificare il file .gitmodules per aggiornare l'URL e quindi eseguire git submodule sync per riflettere la modifica apportata al superprogetto e alla tua copia di lavoro.

+1

Che affetto dovrebbe git sincronizzazione modulo hanno? Lo sto facendo in modo errato in http://gist.github.com/120723, o sono errato nell'aspettare che .git/config sia cambiato da git submodule sync? –

+16

Questo non sembra aggiornare .git/config, almeno in 1.7.1 o 1.7.3. – notJim

+5

Ho aggiornato '.git/config' per me, ho git 1.7.5.4. – mxcl

52

In realtà, una patch has been submitted in April 2009 per chiarire il ruolo gitmodule.

Così ora la gitmodule documentation non include ancora:

Il file .gitmodules, si trova nella directory di livello superiore di un albero di lavoro git, è un file di testo con una sintassi corrispondenti ai requisiti -Di linkgit: git-config 1.
[NUOVO]:
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 dei record specifici dell'utente (ad esempio per tenere conto delle differenze negli URL dei sottoprogrammi dovuti a situazioni di rete) devono essere apportate al file di configurazione, mentre le modifiche dei record da propagare (ad esempio + a causa di un trasferimento della sorgente del sottomodulo) devono essere effettuate a questo file.

Questo praticamente conferma Jim's answer.


Se si segue questo git submodule tutorial, si vede è necessario un "git submodule init" per aggiungere gli URL del repository modulo di .git/config.

"git submodule sync" ha been added in August 2008 precisamente per semplificare tale compito quando l'URL cambia (specialmente se il numero di sottomoduli è importante).
Lo script associato con questo comando è abbastanza semplice:

module_list "[email protected]" | 
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"

+0

Volevo cambiare l'URL del submodule solo su questa macchina. Dal progetto principale ho potuto modificare il record di '.git/config' facendo:.' Git modulo config "$ submodule_name" .url "$ NEW_URL" 'che è [descritto anche qui] (http: // StackOverflow. COM/a/928539/99777). – joeytwiddle

8

Basta modificare il proprio/ file di .git config. Per esempio; se si dispone di un "comune" modulo si può fare questo nel super-modulo:

git config submodule.common.url /data/my_local_common 
56

Quello che ha funzionato per me (su Windows, utilizzando la versione git 1.8.3.msysgit.0):

  • Aggiornamento .gitmodules con il percorso del nuovo repository
  • Rimuovere la riga corrispondente da ".git/config file "
  • Eliminare la directory corrispondente nella" .git/modules/"directory esterna
  • Eliminare la directory modulo controllato stesso (incerto se questo è necessario)
  • Run git submodule init e git submodule update
  • assicurarsi che il modulo controllato è alla giusta commit, e commettere che, dal momento che è probabile che l'hash sarà diverso

Dopo aver fatto tutto questo, tutto è nello stato in cui mi sarei aspettato. immagino che altri utenti di il repository avrà la sim il dolore ilar quando vengono ad aggiornare però - sarebbe saggio spiegare questi passaggi nel tuo messaggio di commit!

+2

Grazie mille per questo. Questo è l'unico che ha funzionato per me dopo aver già eseguito un aggiornamento del sottomodulo 'git'. Seguendo le altre risposte non si cambierebbe ciò che era nella directory './Git/modules/external', quindi il tentativo di aggiornare comporterebbe l'estrazione dell'URL errato. – NtscCobalt

+0

questo sembra essere un po 'pericoloso, e non sono sicuro che conservi la cronologia del precedente sottomodulo. Se, per esempio, vuoi controllare un vecchio commit o ramo del tuo repository principale (quello contenente il sottomodulo) non sono sicuro che saprà tirare il submodule OLD allegato e correlato a quel vecchio commit del main . –

+0

No, quasi certamente non lo saprà - dovrai fare di nuovo tutti i passaggi dopo il primo. Questo è proprio quello che ho trovato funzionante per il nuking lo stato attuale del sottomodulo. Non so se lo stato delle cose è cambiato da quando ho scritto questo, mente :) –

71

Questi comandi fare il lavoro sul prompt dei comandi senza alterare alcun file sul 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 

Si prega di guardare il blog per gli screenshot: Changing GIT submodules URL/Branch to other URL/branch of same repository

+4

Questo ha funzionato ma dovevo ricordare di spingere le modifiche al telecomando. 'git add. .gitmodules'' git commit -m "URL del submodulo modificato" '' git push origin master ' – skulz00

+0

Grazie per l'aggiornamento. Ho dimenticato di includere il comando git add/commit/push. –

+2

Beh, questo ha creato un pasticcio terribile per me. I comandi sono passati in silenzio, ma il repository del sottomodulo 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? –

3

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

19

In termini semplici, è sufficiente modificare il file .gitmodules, quindi risincronizzare e aggiornare:

Modificare il file, sia tramite un comando git o direttamente:

git config --file=.gitmodules -e 

o semplicemente:

vim .gitmodules 

poi risincronizzazione e aggiornamento:

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