Domanda Come rimuovo un sottomodulo?


Come rimuovo un sottomodulo Git?

A proposito, c'è una ragione che non posso semplicemente fare

git submodule rm whatever

?


3018
2017-08-11 14:31


origine


risposte:


Da git1.8.3 (22 aprile 2013):

Non c'era un modo in cui la porcellana dicesse "Non sono più interessato a questo sottomodulo", una volta che esprimi il tuo interesse per un sottomodulo con "submodule init".
  "submodule deinit"è il modo per farlo.

Anche il processo di cancellazione viene utilizzato git rm (dal git1.8.5 ottobre 2013).

Sommario

Il processo di rimozione in 3 passaggi sarebbe quindi:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Spiegazione

rm -rf: Questo è menzionato in Daniel Schroeder'S rispostae riassunto da Eonil in i commenti:

Questo lascia .git/modules/<path-to-submodule>/ invariato.
  Quindi se una volta elimini un sottomodulo con questo metodo e li ri-aggiungi di nuovo, non sarà possibile perché il repository è già stato danneggiato.


git rm: Vedi commit 95c16418:

Attualmente usando "git rm"su un submodule rimuove l'albero di lavoro del submodule da quello del superproject e il gitlink dall'indice.
  Ma la sezione del sottomodulo in .gitmodules è rimasto intatto, che è un residuo del sottomodulo ora rimosso e potrebbe irritare gli utenti (in contrasto con l'impostazione in .git/config, questo deve ricordare che l'utente ha mostrato interesse per questo sottomodulo, in modo che possa essere ripopolato in seguito quando viene eseguito il checkup più vecchio).

Permettere "git rm"aiutare l'utente non solo rimuovendo il sottomodulo dall'albero di lavoro ma rimuovendo anche il"submodule.<submodule name>"sezione dal .gitmodules archiviare e mettere in scena entrambi.


git submodule deinit: Deriva da questa patch:

Con "git submodule init"l'utente è in grado di dire a Git che interessa uno o più sottomoduli e vuole che venga compilato alla prossima chiamata a"git submodule update".
  Ma al momento non c'è un modo semplice in cui possano dire a git che non si preoccupano più di un sottomodulo e vogliono sbarazzarsi dell'albero di lavoro locale (a meno che l'utente non sappia molto sui sottomodali interni e rimuova il "submodule.$name.url"impostazione da .git/config insieme con l'albero di lavoro stesso).

Aiuta quegli utenti fornendo un 'deinit'comando.
  Questo rimuove il tutto submodule.<name> sezione da .git/config o per il dato   modulo (s) (o per tutti quelli che sono stati inizializzati se '.' viene data).
  Fallisce se l'albero di lavoro corrente contiene modifiche se non forzato.
  Reclami quando per un sottomodulo indicato nella riga di comando non è possibile trovare l'impostazione dell'URL in .git/config, ma comunque non falliscono.

Questo si occupa dei passaggi di (de) inizializzazione (.git/config e .git/modules/xxx)

Dal momento che git1.8.5, il git rm prende anche cura di:

  • 'add'step che registra l'url di un sottomodulo in .gitmodules file: è necessario rimuovere per te.
  • il sottomodulo voce speciale (come illustrato da questa domanda): il git rm lo rimuove dall'indice:
    git rm --cached path_to_submodule(nessuna barra finale)
    Ciò rimuoverà quella directory memorizzata nell'indice con una modalità speciale "160000", contrassegnandola come directory root del sottomodulo.

Se si dimentica l'ultimo passaggio e si tenta di aggiungere quello che era un sottomodulo come una directory normale, si otterrebbe un messaggio di errore come:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Nota: da Git 2.17 (Q2 2018), il deit di sottomulo git non è più uno script di shell.
È una chiamata a una funzione C.

Vedere commit 2e61273, commit 1342476 (14 gennaio 2018) di Prathamesh Chavan (pratham-pc).
(Fuso da Junio ​​C Hamano - gitster - in commettere ead8dbe, 13 febbraio 2018) 

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1796
2018-04-23 05:57



Tramite la pagina Git Submodule Tutorial:

Per rimuovere un sottomodulo devi:

  1. Elimina la sezione pertinente dal .gitmodules file.
  2. Stage the .gitmodules i cambiamenti git add .gitmodules
  3. Elimina la sezione pertinente da .git/config.
  4. Correre git rm --cached path_to_submodule (nessuna barra finale).
  5. Correre rm -rf .git/modules/path_to_submodule
  6. Commettere git commit -m "Removed submodule <name>"
  7. Elimina i file del sottomodulo ora non tracciati
    rm -rf path_to_submodule

Guarda anche: passaggi alternativi qui sotto.


3143
2018-01-18 23:30



Solo una nota. Dal git 1.8.5.2, due comandi faranno:

git rm the_submodule
rm -rf .git/modules/the_submodule

Come ha giustamente sottolineato la risposta di @Mark Cheverton, se la seconda riga non viene utilizzata, anche se per ora hai rimosso il sottomodulo, la rimanente cartella .git / modules / the_submodule impedirà l'aggiunta o la sostituzione dello stesso sottomodulo in futuro . Inoltre, come menzionato @VonC, git rm farà la maggior parte del lavoro su un sottomodulo.

--Aggiornamento (07/05/2017) -

Giusto per chiarire, the_submodule è il percorso relativo del sottomodulo all'interno del progetto. Ad esempio, lo è subdir/my_submodule se il sottomodulo si trova in una sottodirectory subdir.

Come sottolineato correttamente nei commenti e altre risposte, i due comandi (anche se funzionalmente sufficienti per rimuovere un sottomodulo), lasciano una traccia nel file [submodule "the_submodule"] sezione di .git/config (a partire da luglio 2017), che può essere rimosso utilizzando un terzo comando:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

330
2018-04-13 08:51



La maggior parte delle risposte a questa domanda sono obsolete, incomplete o inutilmente complesse.

Un sottomodulo clonato usando git 1.7.8 o più recente lascerà al massimo quattro tracce di sé nel repository locale. Il processo per rimuovere queste quattro tracce è dato dai tre comandi seguenti:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

244
2018-03-02 16:07



Semplici passaggi

  1. Rimuovi le voci di configurazione:
    git config -f .git/config --remove-section submodule.$submodulename
      git config -f .gitmodules --remove-section submodule.$submodulename
  2. Rimuovi la directory dall'indice:
    git rm --cached $submodulepath
  3. Commettere
  4. Elimina i file inutilizzati:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Notare che:  $submodulepath non contiene barre iniziali o finali.

sfondo

Quando lo fai git submodule add, lo aggiunge solo a .gitmodules, ma una volta che l'hai fatto git submodule init, ha aggiunto a .git/config.

Quindi se si desidera rimuovere i moduli, ma essere in grado di ripristinarli rapidamente, quindi fai solo questo:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

È una buona idea da fare git rebase HEAD prima e git commit alla fine, se lo metti in una sceneggiatura.

Dai anche un'occhiata una risposta a Posso spopolare un sottomodulo Git?.


183
2017-08-11 14:43



Oltre alle raccomandazioni, dovevo anche farlo rm -Rf .git/modules/path/to/submodule essere in grado di aggiungere un nuovo sottomodulo con lo stesso nome (nel mio caso stavo sostituendo una forcella con l'originale)


80
2017-10-12 10:17



Devi rimuovere la voce in .gitmodules e .git/confige rimuovi la directory del modulo dalla cronologia:

git rm --cached path/to/submodule

Se scriverete sulla mailing list di git probabilmente qualcuno farà uno script di shell per voi.


46
2017-11-01 21:43



Per rimuovere un sottomodulo aggiunto utilizzando:

git submodule add blah@blah.com:repos/blah.git lib/blah

Correre:

git rm lib/blah

Questo è tutto.

Per le vecchie versioni di git (circa ~ 1.8.5) usare:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

45
2017-07-09 17:55



Puoi utilizzare un alias per automatizzare le soluzioni fornite da altri:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Mettilo nella tua git config e poi puoi fare: git rms path/to/submodule


40
2018-05-16 09:27