Vraag Hoe verwijder ik een submodule?


Hoe verwijder ik een Git-submodule?

Trouwens, is er een reden die ik niet simpelweg kan doen

git submodule rm whatever

?


3019
2017-08-11 14:31


oorsprong


antwoorden:


Sinds git1.8.3 (22 april 2013):

Er was geen manier om te zeggen: "Ik ben niet langer geïnteresseerd in deze submodule", als je je interesse in een submodule met "submodule init".
  "submodule deinit"is de manier om dat te doen.

Het verwijderingsproces maakt ook gebruik van git rm (sinds git1.8.5 oktober 2013).

Overzicht

Het verwijderingsproces van 3 stappen zou dan zijn:

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

Uitleg

rm -rf: Dit wordt vermeld in Daniel Schroeder's antwoord, en samengevat door Eonil in de opmerkingen:

Dit gaat weg .git/modules/<path-to-submodule>/ ongewijzigd.
  Dus als u ooit een submodule met deze methode verwijdert en ze opnieuw toevoegt, is dit niet mogelijk omdat de repository al is beschadigd.


git rm: Zien commit 95c16418:

Momenteel gebruikt "git rm"op een submodule verwijdert de werkboom van de submodule van die van het superproject en de gitlink van de index.
  Maar de sectie van de submodule in .gitmodules blijft onaangetast, dat is een overblijfsel van de nu verwijderde submodule en kan gebruikers irriteren (in tegenstelling tot de instelling in .git/config, dit moet blijven als een herinnering dat de gebruiker interesse toonde in deze submodule, zodat deze later opnieuw wordt ingevuld wanneer een oudere commit wordt uitgecheckt).

Laat "git rm"help de gebruiker door niet alleen de submodule uit de werkboom te verwijderen, maar ook door de"submodule.<submodule name>"sectie van de .gitmodules bestand en sta beide op.


git submodule deinit: Het komt voort uit deze patch:

Met "git submodule init"de gebruiker kan vertellen dat het om een ​​of meerdere submodules gaat en wil dat het wordt gevuld bij de volgende oproep om"git submodule update".
  Maar op dit moment is er geen eenvoudige manier om te weten dat ze zich geen zorgen meer maken over een submodule en zich wil ontdoen van de lokale werkboom (tenzij de gebruiker veel weet over submodule internals en de "submodule.$name.url"instelling van .git/config samen met de werkboom zelf).

Help die gebruikers door een 'deinit'commando.
  Deze verwijdert het geheel submodule.<name> sectie van .git/config ofwel voor het gegevene   submodule (s) (of voor al degenen die zijn geïnitialiseerd als '.' is gegeven).
  Mislukt als de huidige werkboom wijzigingen bevat, tenzij geforceerd.
  Klacht wanneer voor een submodule op de opdrachtregel de url-instelling niet kan worden gevonden in .git/config, maar laat het niet falen.

Dit zorgt ervoor als de (de) initialiseringsstappen (.git/config en .git/modules/xxx)

Sinds git1.8.5, de git rm neemt ook zorg voor de:

  • 'add'stap die de URL van een submodule registreert in de .gitmodules bestand: het moet voor u worden verwijderd.
  • de submodule speciale invoer (zoals geïllustreerd door deze vraag): de git rm verwijdert het uit de index:
    git rm --cached path_to_submodule(geen trash)
    Dat zal die map verwijderen die is opgeslagen in de index met een speciale modus "160000", die het markeert als submodule van een submodule.

Als u die laatste stap bent vergeten en probeert toe te voegen wat een submodule was als een normale directory, krijgt u een foutmelding zoals:

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

Opmerking: sinds Git 2.17 (Q2 2018) is git submodule deinit niet langer een shellscript.
Het is een oproep naar een C-functie.

Zien commit 2e61273, commit 1342476 (14 januari 2018) door Prathamesh Chavan (pratham-pc).
(Samengevoegd door Junio ​​C Hamano - gitster - in commit ead8dbe, 13 febr. 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



Via de pagina Git submodule Tutorial:

Om een ​​submodule te verwijderen, moet u:

  1. Verwijder de relevante sectie uit de .gitmodules het dossier.
  2. Fase de .gitmodules veranderingen git add .gitmodules
  3. Verwijder de relevante sectie uit .git/config.
  4. Rennen git rm --cached path_to_submodule (geen slepende streep).
  5. Rennen rm -rf .git/modules/path_to_submodule
  6. plegen git commit -m "Removed submodule <name>"
  7. Verwijder de nu niet-gevonden submodulebestanden
    rm -rf path_to_submodule

Zie ook: alternatieve stappen hieronder.


3144
2018-01-18 23:30



Gewoon een briefje. Sinds git 1.8.5.2 doen twee commando's het volgende:

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

Zoals het antwoord van @Mark Cheverton correct vermeldde, zal, als de tweede regel niet wordt gebruikt, zelfs als u de submodule nu hebt verwijderd, de overblijvende .git / modules / the_submodule map voorkomen dat dezelfde submodule in de toekomst wordt toegevoegd of vervangen . Zoals @VonC al zei, git rm zal het grootste deel van de klus op een submodule doen.

- Update (07/05/2017) -

Gewoon om te verduidelijken, the_submodule is het relatieve pad van de submodule binnen het project. Bijvoorbeeld, het is subdir/my_submodule als de submodule zich in een submap bevindt subdir.

Zoals correct aangegeven in de opmerkingen en andere antwoorden, de twee commando's (hoewel functioneel voldoende om een ​​submodule te verwijderen), laten een spoor achter in de [submodule "the_submodule"] gedeelte van .git/config (vanaf juli 2017), die kan worden verwijderd met een derde opdracht:

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

331
2018-04-13 08:51



De meeste antwoorden op deze vraag zijn verouderd, onvolledig of onnodig ingewikkeld.

Een submodule gekloond met git 1.7.8 of nieuwer zal maximaal vier sporen van zichzelf achterlaten in je lokale repo. Het proces voor het verwijderen van deze vier sporen wordt gegeven door de drie onderstaande opdrachten:

# 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



Eenvoudige stappen

  1. Configuratie-items verwijderen:
    git config -f .git/config --remove-section submodule.$submodulename
      git config -f .gitmodules --remove-section submodule.$submodulename
  2. Directory uit index verwijderen:
    git rm --cached $submodulepath
  3. plegen
  4. Verwijder ongebruikte bestanden:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Houd er rekening mee dat:  $submodulepath bevat geen voorloop- of achterlijnse schuine strepen.

Achtergrond

Wanneer je dat doet git submodule add, het voegt het alleen toe aan .gitmodules, maar als je dat eenmaal gedaan hebt git submodule init, het is toegevoegd aan .git/config.

Dus als u de modules wilt verwijderen, maar deze snel kunt herstellen, doe dan gewoon dit:

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

Het is een goed idee om te doen git rebase HEAD eerst en git commit aan het einde, als je dit in een script zet.

Kijk ook eens naar een antwoord op Kan ik een Git-submodule ontvolgen?.


183
2017-08-11 14:43



Naast de aanbevelingen moest ik ook rm -Rf .git/modules/path/to/submodule om een ​​nieuwe submodule met dezelfde naam toe te voegen (in mijn geval was ik een vork aan het vervangen door het origineel)


80
2017-10-12 10:17



U moet het item verwijderen .gitmodules en .git/config, en verwijder de map van de module uit de geschiedenis:

git rm --cached path/to/submodule

Als je op git's mailinglist schrijft, zal iemand waarschijnlijk een shell-script voor je doen.


46
2017-11-01 21:43



Een submodule verwijderen die is toegevoegd met behulp van:

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

Rennen:

git rm lib/blah

Dat is het.

Gebruik voor oude versies van git (circa ~ 1.8.5):

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

45
2017-07-09 17:55



U kunt een alias gebruiken om de oplossingen van anderen te automatiseren:

[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"

Zet dat in je git config, en dan kun je doen: git rms path/to/submodule


40
2018-05-16 09:27



Om samen te vatten, is dit wat u zou moeten doen:

  1. set path_to_submodule var (geen schuine streep):

    path_to_submodule=path/to/submodule

  2. Verwijder de relevante regel uit het .gitmodules-bestand:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. Verwijder de relevante sectie uit .git / config

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Verwijderen en verwijderen $ path_to_submodule alleen uit de index (om te voorkomen dat informatie verloren gaat)

    git rm --cached $path_to_submodule

  5. Wijzigingen bijhouden die zijn aangebracht in .gitmodules

    git add .gitmodules

  6. Commiteer het superproject

    git commit -m "Remove submodule submodule_name"

  7. Verwijder de nu niet-gevonden submodulebestanden

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


38
2017-10-22 10:54