Hoe verwijder ik een submodule?

Hoe verwijder ik een Git-submodule?

Trouwens, is er een reden waarom ik het niet gewoon kan doen?
git submodule rm whatever?


Antwoord 1, autoriteit 100%

Sinds git1 .8.3 (22 april 2013):

Er was geen porseleinen manier om te zeggen “Ik ben niet langer geïnteresseerd in deze submodule”, als je eenmaal je interesse in een submodule hebt uitgedrukt met “git submodule init“.
git submodule deinit” is de manier om dit te doen.

Het verwijderingsproces gebruikt ook git rm(sinds git1.8.5 oktober 2013).

Samenvatting

Het verwijderingsproces in 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 Eonilin de opmerkingen:

Hierdoor blijft .git/modules/<path-to-submodule>/ongewijzigd.
Dus als je een keer een submodule verwijdert met deze methode en ze opnieuw toevoegt, zal het niet mogelijk zijn omdat de repository al beschadigd is.


git rm: Zie commit 95c16418:

Het momenteel gebruik van “git rm” op een submodule verwijdert de werkboom van de submodule uit die van het superproject en de gitlink uit de index.
Maar de sectie van de submodule in .gitmodulesblijft onaangeroerd, wat een overblijfsel is van de nu verwijderde submodule en gebruikers zou kunnen 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 zal worden ingevuld wanneer een oudere commit wordt uitgecheckt).

Laat “git rm” de gebruiker helpen door niet alleen de submodule uit de werkboom te verwijderen, maar ook door de sectie “submodule.<submodule name>” te verwijderen uit het .gitmodulesbestand en stage beide.


git submodule deinit: het komt van deze patch:

Met “git submodule init” kan de gebruiker git vertellen dat ze om een of meer submodules geven en deze willen laten invullen bij de volgende aanroep van “git submodule update“.
Maar momenteel is er geen gemakkelijke manier waarop ze git kunnen vertellen dat ze niet meer om een submodule geven en de lokale werkboom willen verwijderen (tenzij de gebruiker veel weet over de internals van submodules en de “submodule.$name.url” instelling van .git/configsamen met de werkboom zelf).

Help die gebruikers door de opdracht ‘deinit‘ op te geven.
Dit verwijdert de hele submodule.<name>sectie van .git/configofwel voor de gegeven
submodule(s)
(of voor al diegenen die geïnitialiseerd zijn als ‘.‘ is opgegeven).
Mislukt als de huidige werkboom wijzigingen bevat, tenzij geforceerd.
Klagen wanneer voor een submodule gegeven op de opdrachtregel de url-instelling niet kan worden gevonden in .git/config, maar faal desalniettemin niet.

Dit zorgt ervoor dat de (de)initialisatiestappen (.git/configen .git/modules/xxx)

Sinds git1.8.5 zorgt de git rmookvoor het:

  • add‘ stap die de url van een submodule in het .gitmodulesbestand vastlegt: deze moet voor je verwijderd worden.
  • de submodule speciaal item(zoals geïllustreerd door deze vraag): de git rm verwijdert het uit de index:
    git rm --cached path_to_submodule(geen slash)
    Dat zal die map die in de index is opgeslagen met een speciale modus “160000” verwijderen, en het markeren als een hoofdmap van een submodule.

Als je die laatste stap vergeet, en probeert om een submodule als een gewone map toe te voegen, krijg je een foutmelding als:

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 aanroep van een C-functie.

Zie commit 2e61273, commit 1342476(14 jan 2018) door Prathamesh Chavan (pratham-pc).
(Samengevoegd door Junio C Hamano — gitsterin commit ead8dbe, 13 februari 2018)

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

Antwoord 2, autoriteit 92%

Via de pagina Git Submodule Tutorial:

Om een submodule te verwijderen moet je:

  1. Verwijder de relevante sectie uit het bestand .gitmodules.
  2. Voer de .gitmoduleswijzigingen uit:
    git add .gitmodules
  3. Verwijder de relevante sectie uit .git/config.
  4. Verwijder de submodule-bestanden uit de werkstructuur en index:
    git rm --cached path_to_submodule(geen slash).
  5. Verwijder de .gitdirectory van de submodule:
    rm -rf .git/modules/path_to_submodule
  6. Voeg de wijzigingen door:
    git commit -m "Removed submodule <name>"
  7. Verwijder de nu niet-getrackte submodule-bestanden:
    rm -rf path_to_submodule

Zie ook: alternatieve stappen hieronder.


Antwoord 3, autoriteit 27%

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

Een submodule die is 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 die vier sporen wordt gegeven door de drie onderstaande commando’s:

# 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

4, Autoriteit 3%

Naast de aanbevelingen, moest ik ook rm -Rf .git/modules/path/to/submoduleom een ​​nieuwe submodule met dezelfde naam (in mijn geval I te kunnen toevoegen was een vork vervangen door het origineel)


5, Autoriteit 3%

Om een ​​submodule toegevoegd te verwijderen met:

git submodule add [email protected]:repos/blah.git lib/blah

Uitvoeren:

git rm lib/blah

Dat is het.

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

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

6, Autoriteit 2%

U moet het item verwijderen in .gitmodulesen .git/configen verwijder de map van de module uit de geschiedenis:

git rm --cached path/to/submodule

Als u op de mailinglijst van Git schrijft, zal iemand waarschijnlijk een shell-script voor u doen.


7, Autoriteit 2%

Om samen te vatten, dit is wat u moet doen:

  1. Instellen path_to_submoduleVAR (GEEN TRACKING SLASH):

    path_to_submodule=path/to/submodule

  2. Verwijder de relevante regel van het bestand .Gitmodules:

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

  3. Verwijder het relevante gedeelte van .git / config

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

  4. UnSpagina en verwijder $ PATH_TO_SUBMODULE ALLEEN VAN DE INDEX (om te voorkomen dat u informatie verliest)

    git rm --cached $path_to_submodule

  5. Trackwijzigingen aangebracht in .gitmodules

    git add .gitmodules

  6. Begin het SuperProject

    git commit -m "Remove submodule submodule_name"

  7. Verwijder de nu niet bijgehouden submodulebestanden

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


Antwoord 8, autoriteit 2%

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


Antwoord 9, autoriteit 2%

Ik vond dat deinitgoed voor mij werkt:

git submodule deinit <submodule-name>    
git rm <submodule-name>

Van git docs:

deinit

De registratie van de opgegeven submodules ongedaan maken, d.w.z. de hele submodule.$nameverwijderen
sectie van .git/config samen met hun werkboom.


Antwoord 10, autoriteit 2%

Als de submodule per ongelukis toegevoegd omdat je een map hebt toegevoegd, vastgelegd en gepusht die al een Git-repository was (bevat .git), dan heb je geen .gitmodulesbestand om te bewerken, of iets in .git/config. In dit geval heb je alleennodig:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW, ik heb ook de map .gitverwijderd voordat ik de git add.


Antwoord 11

Na het experimenteren met alle verschillende antwoorden op deze site, eindigde ik met deze oplossing:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

Hiermee herstelt u de exact dezelfde toestand als voordat u de submodule hebt toegevoegd. U kunt meteen weer de submodule toevoegen, die niet mogelijk was met de meeste antwoorden hier.

git submodule add $giturl test
aboveScript test

Dit laat je met een schone afrekenen zonder wijzigingen in commit.

Dit is getest met:

$ git --version
git version 1.9.3 (Apple Git-50)

12

Wat ik momenteel doe, dec 2012 (combineert de meeste van deze antwoorden):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"

13

Hier is wat ik deed:

1.) Verwijder de relevante sectie van het .gitmodules-bestand. U kunt onderstaande opdracht gebruiken:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) Stadium de .gitmodulesWijzigingen

git add .gitmodules

3.) Verwijder het relevante gedeelte van .git/config. U kunt onderstaande opdracht gebruiken:

git submodule deinit -f "submodule_name"

4.) Verwijder de gitlink (geen slash):

git rm --cached path_to_submodule

5.) Ruim de .git/modulesop:

rm -rf .git/modules/path_to_submodule

6.) Vastleggen:

git commit -m "Removed submodule <name>"

7.) Verwijder de nu niet bijgehouden submodulebestanden

rm -rf path_to_submodule

Antwoord 14

  1. git submodule deinit <path to submodule>
  2. Verwijder de sectie uit .gitmodules
  3. Bel: git rm <path to submodule>
  4. Verwijder de modulebestanden die u uit uw project moet verwijderen.
  5. Voeg de verwijderde bestanden toe aan git en bel git add .gitmodules
  6. Toezeggen en pushen

Antwoord 15

Ik heb onlangs een git-project ontdekt dat veel nuttige git-gerelateerde opdrachten bevat: https://github.com /visionmedia/git-extras

Installeer het en typ :

git-delete-submodule submodule

Dan zijn de dingen gedaan. De map van de submodule wordt verwijderd uit uw repo en bestaat nog steeds in uw bestandssysteem. Je kunt de wijziging dan vastleggen als: git commit -am "Remove the submodule".


Antwoord 16

Ik moest de stappen van John Douthat nog een stap verder nemen en cdin de directory van de submodule zetten, en dan de Git-repository verwijderen:

cd submodule
rm -fr .git

Dan zou ik de bestanden kunnen committen als onderdeel van de bovenliggende Git-repository zonder de oude verwijzing naar een submodule.


Antwoord 17

Hier zijn de 4 stappen die ik nodig of nuttig vond (belangrijke eerst):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

In theoriezou git rmin stap 1ervoor moeten zorgen. Hopelijk kan het tweede deel van de OP-vraag op een dag positief worden beantwoord (dat dit in één opdracht kan).

Maar vanaf juli 2017 is stap 2nodig om gegevens in .git/modules/te verwijderen, anders kun je b.v. voeg de submodule in de toekomst weer toe.

Je kunt waarschijnlijk wegkomen met de bovenstaande twee stappen voor git 1.8.5+ zoals tinlyx’s antwoordopmerkte, zoals alle git submodulecommando’s lijken te werken.

Stap 3 verwijdert de sectie voor the_submodulein het bestand .git/config. Dit dient voor de volledigheid te gebeuren. (De invoer kan problemen veroorzaken voor oudere git-versies, maar ik heb er geen om te testen).

Hiervoor raden de meeste antwoorden aan om git submodule deinitte gebruiken. Ik vind het explicieter en minder verwarrend om git config -f .git/config --remove-sectionte gebruiken. Volgens de git-submodule documentatie, git deinit:

De registratie van de opgegeven submodules ongedaan maken … Als u echt een . wilt verwijderen
submodule uit de repository en commit die gebruik maken van git-rm[1]
in plaats daarvan.

Last but not least, als je git commitniet doet, krijg/kan je een foutmelding krijgen bij het doen van git submodule summary(vanaf git 2.7):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

Dit is ongeacht of u stap 2 of 3 uitvoert.


Antwoord 18

Ik heb zojuist het verborgen bestand .submodule (exacte naam vergeten) gevonden, het heeft een lijst… je kunt ze op die manier afzonderlijk wissen. Ik had er net een, dus die heb ik verwijderd. Eenvoudig, maar het kan Git in de war brengen, omdat ik niet weet of er iets aan de submodule is gekoppeld. Lijkt tot nu toe in orde, afgezien van het gebruikelijke upgradeprobleem van libetpan, maar dat heeft (hopelijk) niets met elkaar te maken.

Zie dat niemand handmatig wissen heeft gepost, dus toegevoegd


Antwoord 19

Met git 2.17 en hoger is het gewoon:

git submodule deinit -f {module_name}
git add {module_name}
git commit

20

met git v2.7.4 Eenvoudige 3 stappen werkte prima.

git submodule deinit -f -- a/submodule    
git rm -f a/submodule
git commit

21

project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

22

Als je zojuist de submodule hebt toegevoegd, en je hebt bijvoorbeeld gewoon de verkeerde submodule toegevoegd of je hebt hem op de verkeerde plaats toegevoegd, doe dan gewoon git stashen verwijder vervolgens de map. Dit veronderstelt dat het toevoegen van de submodule het enige is wat je deed in de recente repo.


Antwoord 23

Samenvattend, dit is wat u moet doen:

Set path_to_submodule var (geen slash aan het einde):

path_to_submodule=path/to/submodule

Verwijder de relevante regel uit het .gitmodules-bestand:

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

Verwijder de relevante sectie uit .git/config

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

Onstage en verwijder $path_to_submodule alleen uit de index (om te voorkomen dat informatie verloren gaat)

git rm --cached $path_to_submodule

Wijzigingen in .gitmodules bijhouden

git add .gitmodules

Maak het superproject vast

git commit -m "Remove submodule submodule_name"

Verwijder de nu niet-getrackte submodule-bestanden

rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule

Zie ook: Alternatieve richtlijnen


Antwoord 24

Ik heb een bash-script gemaakt om het verwijderingsproces te vergemakkelijken. Het controleert ook of er wijzigingen zijn in de repo die niet zijn opgeslagen en vraagt om bevestiging.
Het is getest op os xen het zou interessant zijn om te weten of het ook werkt zoals het is op gewone Linux-distributies:

https://gist.github.com/fabifrank/cdc7e67fd194333760B060835AC0172F


25

In de nieuwste GIT is slechts 4 bediening nodig om de GIT-submodule te verwijderen.

  • Verwijder het bijbehorende item in .gitmodules
  • Stage Wijzigingen git add .gitmodules
  • Verwijder de submodule-directory git rm --cached <path_to_submodule>
  • Begin het git commit -m "Removed submodule xxx"

26

Als u het wilt doen in One Line-opdracht met BASH-script zoals hieronder:

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

Maak een bash-scriptbestand in de $HOMEDIR NAMEED I.E. remove_submodule.sh:

#!/bin/bash
git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet

Other episodes