Come si sostituisce un sottomodulo git con un altro repository?


96

Come si sostituisce un sottomodulo git con un repository git diverso?

Nello specifico, ho un sottomodulo:

  • situato in ./ExternalFrameworks/TestFrameworkquel punto a un repository gitgit@github.com:userA/TestFramework.git
  • Mi piacerebbe che ora puntasse git@github.com:userB/TestFramework.git.

Il problema è che quando elimino il sottomodulo con il metodo descritto qui , lo aggiungo di nuovo utilizzando il comando

git submodule add git@github.com:userB/TestFramework.git

Ottengo questo errore:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com: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.

Risposte:


123

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

  1. Modifica il tuo .gitmodulefile per utilizzare il nuovo URL
  2. Elimina la cartella del sottomodulo nel repository rm -rf .git/modules/<submodule>
  3. Elimina la cartella del sottomodulo nella directory di lavoro rm -rf <submodule>
  4. Correre git submodule sync
  5. Correre git submodule update

Informazioni più complete possono essere trovate altrove:


4
Vale anche la pena notare: quando un altro utente (che aveva già avviato il sottomodulo) ottiene il tuo aggiornamento, dovrà anche eseguire la "sincronizzazione del sottomodulo git" una volta prima che il nuovo sottomodulo funzioni per loro.
joseph.hainline

2
Questo non ha funzionato per me. Dopo questo, il mio sottomodulo puntava ancora al vecchio URL. Qualche idea sul perché?
Arne

34
@Arne Forse il tuo sottomodulo non è mai stato inizializzato correttamente. Ho dovuto farlo rm -rf .git/modules/<submodule>prima che funzionasse per me.
David Braun

@DavidBraun Ho lo stesso problema di @Arne anche se git submodule syncdopo aver rm -rf .git/modules/<submodule>dato fatal: Not a git repository: ../.git/modules/<submodule>. Qualche consiglio? Inizialmente ho creato il sottomodulo tramite git submodule add https://<submodule-url>come da documenti git ...
acannon828

1
Successivamente ho dovuto cd nella directory del modulo, git checkout il ramo che voglio, quindi git pull.
Nicolas Raoul

34

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

  • Elimina la sezione pertinente dal .gitmodulesfile
  • Elimina la sezione pertinente da .git/config
  • Corri git rm --cached path_to_submodule(nessuna barra finale)
  • Eseguire il commit ed eliminare i file del sottomodulo ora non tracciati

Ora aggiungi il nuovo sottomodulo con la --namebandiera. Questo darà a git un nome alternativo a cui fare riferimento .git/configper il sottomodulo, per eliminare i conflitti con il sottomodulo che c'era storicamente, che vuoi ancora lavorare nella tua storia precedente.

Quindi digita:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

e otterrai il sottomodulo caricato nel percorso previsto.


2
Anche se in questo modo funziona, non è così pulito come il metodo di Tim.
joseph.hainline

4
Questo ha funzionato per me, ma ho anche dovuto eliminare .git/modules/<path_to_submodule>.
Nate

1
Apprezzo il riferimento a --name. Non ero a conoscenza dei problemi che circondano questo e non sono stato in grado di sostituire un sottomodulo fino a quando non ho utilizzato questa opzione (grazie alla tua risposta).
aknuds1

Questo ha finito per essere l'unico metodo che ha funzionato per me, tuttavia volevo mantenere lo stesso nome di directory. Ha effettuato il checkout del percorso corretto e ha reso il nome del modulo il nome desiderato, ma il nome della directory di lavoro era il nuovo nome del repository. Quindi se vuoi lo stesso nome devi anche specificarlo alla fine dell'url in questo modo: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

8

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

5

Ciò che ha risolto questo problema per me era nella radice del tuo repository git (non nel sottomodulo), run

rm -rf .git/modules/yourmodule

Quindi dovresti essere in grado di aggiungere normalmente.


3

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 .gitmodulesmanualmente il mio . Ho anche scritto un post sul blog a riguardo.


2

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

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

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

Questo è descritto come "modifiche al record specifico dell'utente" qui .

Non eseguiregit submodule syncpoiché verrà ripristinato nuovamente l'URL predefinito.

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.