Qual è il modo attuale per rimuovere un sottomodulo git?


91

a partire dalla versione 1.9.3 di git (Apple Git-50) su mac come si rimuove un sottomodulo git? Sto leggendo molte informazioni obsolete con molti sviluppatori che mi dicono che non funzioneranno. Qual è il modo attuale? farà git deinit pathToSubModule il trucco?

I passaggi che pensavo avrebbero funzionato sono qui, ma i commenti dicono che non lo faranno.

Lascia che ti spieghi la mia situazione attuale e cosa devo fare. Ho installato il repository rapido e l'ho aggiunto come sottomodulo al mio progetto. Questo codice è già archiviato e altri lo stanno utilizzando. Quello che ora devo fare è fare il fork dello stesso repository Quick e ospitarlo su un GitHub più sicuro della mia azienda (quindi un altro GitHub privato). Dopo averlo biforcato, voglio aggiungere quel fork come gitSubmodule e lasciarlo sostituire l'attuale sottomodulo Quick che avevo installato in precedenza.

aggiornamento: ho letto che quanto segue è il modo corretto nell'ultima versione di git per favore conferma?

To remove a submodule added using:

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

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

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

Ho lottato contro i problemi del sottomodulo per due giorni. La svolta è arrivata quando ho trovato questo: forums.developer.apple.com/thread/13102 . Fondamentalmente, Xcode e forse altre app hanno difficoltà a espandere gli URL contenenti "~". Dopo aver cambiato ssh: //username@server.remoteHost.com/~/git/MyRepo.git in ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (cerca il percorso effettivo sul tuo server), tutte le stranezze sono scomparse in dieci minuti.
Elise van Looij

Risposte:


193

Tu hai il git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Annullare la registrazione dei sottomoduli dati, ovvero rimuovere l'interasubmodule.$name
sezione .git/configinsieme al loro albero di lavoro.

Ulteriori richieste di git submodule update, git submodule foreache git submodule syncsi salta eventuali sottomoduli non registrati fino a quando non vengono inizializzati di nuovo, in modo da utilizzare questo comando se non si vuole avere un checkout locale del modulo nel vostro albero di lavoro più.

Se vuoi davvero rimuovere un sottomodulo dal repository e eseguire il commit di git rmquell'uso.

Se --forcespecificato, l'albero di lavoro del sottomodulo verrà rimosso anche se contiene modifiche locali.


8
Voglio cancellare completamente il sottomodulo per me e anche per gli altri utenti. Quindi tutto ciò di cui ho bisogno è git submodule deinit asubmodule; e git rm come sottomodulo ?? E per quanto riguarda il sottomodulo memorizzato nella cache degli altri utenti, dovrebbero eliminarlo dopo averlo rimosso?
j2emanue

1
Volevo eliminare la copia locale del sottomodulo e ha funzionato perfettamente, tutti i file nella sottodirectory sono spariti.
malhal

1
Potrebbe anche essere necessario rm -rf <asubmodule>se hai già estratto una versione del repository di base che ha annullato la registrazione del sottomodulo.
Sarah Messer

6

Sto usando Git versione 2.16.2 e git rmfa il lavoro per lo più bene:

git rm path-to-submodule

È possibile verificare con git statuse git diff --cachedche questo deinizializza il sottomodulo e lo modifica .gitmodulesautomaticamente. Come sempre, devi effettuare il cambiamento.

Tuttavia, anche se il sottomodulo viene rimosso dal controllo del codice sorgente, .git/modules/path-to-submodulecontiene ancora il repository del sottomodulo e .git/configcontiene il suo URL, quindi devi comunque rimuoverli manualmente:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

Mantenere il repository e la configurazione del sottomodulo è intenzionale in modo da poter annullare la rimozione ad es git reset --hard.


1
risposta più recente e la soluzione più breve
TurboGuma

3

Come rimuovere in sicurezza un sottomodulo.

(si aggiunge a https://stackoverflow.com/a/1260982/342794 )

  1. Elenca e individua la sezione del sottomodulo nel .gitmodulesfile. Dì tramite terminale vi .gitmodules. Esempio:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. I sottomoduli possono essere utilizzati con fork locali. Per progetti di lunga durata, il codice potrebbe differire dal repository originale e potrebbe avere alcune correzioni. È una buona idea verificare se il codice del sottomodulo ha subito modifiche nel corso del progetto. Esempio: guarda i log, se punta a un masterramo o un ramo locale. esplorando i log di git per trovare le modifiche apportate tramite terminale. in genere questi sono memorizzati in una directory, il mio esempio, in submodulesdirectory.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Rimuovi la sezione del sottomodulo da .gitmodules, salva il file. Esempio: git statusdovrebbe mostrare solo quanto segue come modificato

    modified:   .gitmodules
    
  4. Metti in scena i cambiamenti con git add .gitmodules.

  5. Elenca e individua la sezione del sottomodulo nei .git/configfile. Dì tramite terminale vi .git/config. Esempio:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. Rimuovere i file sobmodule della cache di git. l'esecuzione git rm --cached submodules/afnetworking(nessuna barra finale) lo rimuoverebbe correttamente. Esempio:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Rimuovere i file del sottomodulo nella .gitdirectory con rm -rf .git/modules/.... Confermalo con git statusdopo.

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. Applica le modifiche. Confermare con git statusdopo.

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. Elimina i file del sottomodulo non tracciato.

    User$ rm -rf submodules/afnetworking
    
  10. Elimina i riferimenti dal progetto Xcode. Crea, risolvi problemi di compilazione e runtime.

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.