Rinomina un sottomodulo git


156

C'è un modo semplice per rinominare una directory di sottomodulo git (oltre a passare attraverso l'intero movimento di eliminarlo e aggiungerlo di nuovo con un nuovo nome di destinazione).

E mentre ci siamo, perché semplicemente non riesco a fare quanto segue nella directory principale: git mv old-submodule-name new-submodule-name


6
Non sarà più necessario aggiornare .gitmodulesmanualmente quando si sposta un sottomodulo. vedi la mia risposta qui sotto
VonC

La risposta di @VonC ha funzionato come un incantesimo per me
laconbass,

I moduli Git sono troppo complicati. npmmostra come funziona semplice. Un giorno ... forse ... qualcuno ... lo riscriverà ... nel frattempo ...
Rolf

La risposta di @ VonC non è la storia completa di oggi: cambierà davvero .gitmodules, ma rinominerà semplicemente il percorso, non il nome del modulo. Hai bisogno di un'ulteriore modifica a .gitmodules per correggerlo e una 'sincronizzazione del sottomodulo git' per completare l'intero processo
zertyz,

@zertyz: La proprietà [sottomodule "name_of_submodule"] è un nome interno Git, puoi rinominarlo per non confonderti ma è solo un'etichetta.
MKesper

Risposte:


101

Ho trovato il seguente flusso di lavoro funzionante:

  • Aggiorna .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Nota: questo approccio non aggiorna correttamente l'indice e i .gitmodules nelle versioni 2018 di GIT.

Nota: Si può essere in grado di fare ora solo git mv oldpath newpathora, come fuori punte in VonC 's risposta . (Assicurati di utilizzare l'ultima versione di Git)


22
nota a se stesso: per git add newpathnon usare una barra finale
atomicules

10
Con tale flusso di lavoro, creerai un link simbolico alla sottodirectory che usi come sottomodulo. Symlink è solo una parte della funzionalità del sottomodulo globale. Ciò significa che quando si clonano i repository che utilizzano i sottomoduli rinominati, è possibile che si verifichi il seguente errore: Nessuna mappatura del sottomodulo trovata in .gitmodules per il percorso 'your-oldpath' Dopo aver rimosso oldpath (* git rm oldpath ), è necessario usa git submodule aggiungi REPO-URL newpath invece di "git add newpath *. Al termine, lo stato git mostrerà qualcosa del genere: rinominato: oldpath -> newpath
Bertrand,

5
Questa soluzione non funziona per me perché quando si utilizza il comando git add, il sottomodulo è stato incluso nel progetto come una semplice directory e non come sottomodulo. prova $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule aggiungi submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adamo,

3
Se si riscontra il problema con l'albero di lavoro, è anche possibile modificare il .git/modules/SUBMODULE/configfile, in modo che worktreepunti nuovamente nella directory corretta.
Vincent Ketelaars,

3
Questo non ha funzionato per me con Git 2.13.1. Ma semplicemente fare git mv old newfunziona come un fascino. Ho solo bisogno di fare git commit per completare le modifiche.
utente

226

Git1.8.5 (ottobre 2013) dovrebbe semplificare il processo . Basta fare un:

git mv A B

" git mv A B", quando si sposta un sottomodulo Aè stato insegnato a spostare il suo albero di lavoro e ad adattare i percorsi nel .gitmodulesfile .


Vedi altro in commit 0656781fadca1 :

Attualmente l'utilizzo di " git mv" su un sottomodulo sposta l'albero di lavoro del sottomodulo in quello del superprogetto. Ma l'impostazione del percorso del sottomodulo .gitmodulesviene lasciata intatta, che ora è incoerente con l'albero di lavoro e fa sì che i comandi git che si basano sul corretto path -> name mapping(like statuse diff) si comportino in modo strano.

Lascia che " git mv" aiuti qui non solo spostando l'albero di lavoro del sottomodulo ma anche aggiornando l' submodule.<submodule name>.pathimpostazione " " dal .gitmodulesfile e mettendoli in scena entrambi.
Ciò non accade quando non .gitmodulesviene trovato alcun file e viene emesso un avviso solo quando non è presente una sezione per questo sottomodulo. Questo perché l'utente potrebbe semplicemente usare gitlink semplici senza il .gitmodulesfile o ha già aggiornato a mano l'impostazione del percorso prima di eseguire il comando "git mv" (nel qual caso l'avvertimento gli ricorda che lo mvavrebbe fatto per lui).
Solo quando .gitmodulesviene trovato e contiene conflitti di unione il mvcomando fallirà e dirà all'utente di risolvere il conflitto prima di riprovare.


git 2.9 (giugno 2016) migliorerà git mvper il sottomodulo:

Vedi commit a127331 (19 apr 2016) di Stefan Beller ( stefanbeller) .
(Unita da Junio ​​C Hamano - gitster- in commit 9cb50a3 , 29 apr 2016)

mv: consente lo spostamento di sottomoduli nidificati

" git mv old new" non ha modificato old/correttamente il percorso di un sottomodulo che vive come una sottodirectory all'interno della directory.

i sottomoduli devono comunque aggiornare il loro collegamento alla directory git e anche gli aggiornamenti al .gitmodulesfile.


Nota per sé: prova questo su 1.8.4 e avrai fatal: source directory is empty, source=my_source, destination=my_destination. Ci riproverò quando 1.8.5 avrà una versione stabile.
checksum

@checksum Ma 1.8.5 ha una versione stabile, per almeno alcune ... ore;) github.com/git/git/releases/tag/v1.8.5
VonC

Ho dovuto compilare Git versione 1.8.5.GIT dal codice sorgente perché c'è Git v.1.7.5 nei repository Ubuntu. Come costruire Git dal codice sorgente
Maksim Dmitriev il

2
@MaksimDmitriev ma che dire di un ppa (Personal Package Archive) che ho citato in stackoverflow.com/a/20918469/6309 ?
VonC,

2
git mv semplicemente non funziona a questo scopo sulla mia macchina.
Alexander Dyagilev il


11

Ho appena provato alcuni dei suggerimenti sopra indicati. Sto correndo:

$ git --version
git version 1.8.4

Ho scoperto che era meglio de-init il sottomodulo, rimuovere la directory e creare un nuovo sottomodulo.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Almeno questo è ciò che ha funzionato meglio per me. YMMV!


7

Non è possibile rinominarlo, quindi devi prima rimuoverlo ( deinit) e aggiungerlo di nuovo.

Quindi dopo averlo rimosso:

git submodule deinit <path>
git rm --cached <path>

puoi anche ricontrollare e rimuovere i riferimenti ad esso in:

  • .gitmodules
  • .git/config
  • rimuovere la cartella di riferimento da .git/modules/<name>(meglio eseguire un backup), poiché ogni cartella ha un configfile in cui mantiene il riferimento al proprioworktree

quindi mettere in scena le modifiche apportando eventuali modifiche al repository:

git commit -am 'Removing submodule.'

e ricontrolla se non hai problemi in sospeso:

git submodule update
git submodule sync
git submodule status

quindi ora puoi aggiungere di nuovo il sottomodulo git:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

inoltre è in realtà oggi
Alexey,

Il titolo delle domande è un termine improprio, si riferisce al percorso, non al nome
Max Robbertze,

3

Modificare il file .gitmodules per rinominare il sottomodulo e quindi rinominare la directory del sottomodulo.

Penso che potresti aver bisogno di fare un git submodule syncseguito, ma non sono in grado di controllare in questo momento.


Ciò fa sì che il nuovo nome del sottomodulo si verifichi come nuovo commit e non come rinomina. Ma forse è così che deve essere?
Lars Tackmann,

1
@Lars: assicurati di rimuovere anche la vecchia directory del sottomodulo!
Cascabel,

3

MacOs : quando voglio usare la soluzione VonC per cambiare la cartella del sottomodulo Commonin minuscolo:

git mv Common common

ottengo

fatale: ridenominazione "Comune" non riuscita: argomento non valido

Soluzione: utilizzare un nome di cartella temporaneo e spostare due volte:

git mv Common commontemp
git mv commontemp common

È tutto :)

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.