Come posso sostituire un sottomodulo git con un altro repository?

Come posso sostituire un sottomodulo git con un diverso repository git?

Nello specifico, ho un sottomodulo:

  • situato in ./ExternalFrameworks/TestFramework che punta a un git repo [email protected]:userA/TestFramework.git
  • Mi piacerebbe che ora [email protected]:userB/TestFramework.git .

Il problema è che quando elimino il sottomodulo con il metodo descritto qui , lo aggiungo nuovamente usando il comando

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

Ottengo questo errore:

 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. 

Se la posizione (URL) del sottomodulo è cambiata, allora puoi semplicemente:

  1. Modifica il tuo file .gitmodule per utilizzare il nuovo URL
  2. Esegui la git submodule sync

Informazioni più complete possono essere trovate altrove:

  • Cambiare repository remoto per un sottomodulo git
  • Come cambiare un URL del sottomodulo git

Innanzitutto, elimina il sottomodulo corrente con il metodo già menzionato qui , che sto includendo per comodità:

  • Elimina la sezione pertinente dal file .gitmodules
  • Elimina la sezione pertinente da .git/config
  • Esegui git rm --cached path_to_submodule (nessuna barra finale)
  • Conferma ed elimina i file del sottomodulo ora non tracciati

Ora aggiungi il nuovo sottomodulo con il flag --name . Questo darà a git un nome alternativo di riferimento in .git/config per il sottomodulo, per decodificare con il sottomodulo che era storicamente presente, che si vuole comunque lavorare nella cronologia precedente.

Quindi scrivi:

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

e avrai il sottomodulo caricato nel percorso che ti aspetti.

Questi comandi eseguiranno il lavoro al 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 Dev git submodule sync git submodule update --init --recursive --remote 

Quello che mi ha risolto era nella radice del tuo repository git (non nel sottomodulo), corri

 rm -rf .git/modules/yourmodule 

Quindi dovresti essere in grado di aggiungere normalmente.

Il modo più semplice che ho trovato è questo:

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

Non mi piaceva l’idea di modificare manualmente i miei .gitmodules . Ho anche scritto un post su questo blog .

Se desideri modificare l’URL remoto solo per questo clone :

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

Ciò non influirà sul file .gitmodules nel progetto padre, quindi non verrà propagato ad altri sviluppatori.

Questo è descritto qui come “modifica dei record specifici dell’utente”.

Non eseguire la git submodule sync perché verrà reimpostata nuovamente sull’URL predefinito.