Hoe vervang ik een git-submodule door een andere repo?

Hoe vervang ik een git-submodule door een andere git-repo?

Specifiek heb ik een submodule:

  • bevindt zich op ./ExternalFrameworks/TestFrameworkdie verwijst naar een git repo [email protected]:userA/TestFramework.git
  • Ik zou nu willen dat het verwijst naar [email protected]:userB/TestFramework.git.

Het probleem is dat wanneer ik de submodule verwijder met de beschreven methode hier, voeg het dan opnieuw toe met het commando

git submodule add [email protected]:userB/TestFramework.git

Ik krijg deze foutmelding:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Antwoord 1, autoriteit 100%

Als de locatie (URL) van de submodule is gewijzigd, kunt u eenvoudig:

  1. Wijzig uw .gitmodulebestand om de nieuwe URL te gebruiken
  2. Verwijder de map submodule in de repo rm -rf .git/modules/<submodule>
  3. Verwijder de map submodule in de werkmap rm -rf <submodule>
  4. Voer git submodule sync
  5. uit

  6. Voer git submodule update
  7. uit

Meer volledige informatie is elders te vinden:


Antwoord 2, autoriteit 26%

Verwijder eerst de huidige submodule met de reeds genoemde methode hier, die ik voor het gemak bijvoeg:

  • Verwijder de relevante sectie uit het .gitmodulesbestand
  • Verwijder de relevante sectie uit .git/config
  • Voer git rm --cached path_to_submoduleuit (geen slash)
  • Bevestig en verwijder de nu niet-getrackte submodule-bestanden

Voeg nu de nieuwe submodule toe met de vlag --name. Dit zal git een alternatieve naam geven om naar te verwijzen in .git/configvoor de submodule, om het conflict op te lossen met de submodule die er historisch was, en die je nog steeds wilt gebruiken in je voorgeschiedenis.

Dus typ:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

en je krijgt de submodule geladen op het pad dat je verwacht.


Antwoord 3, autoriteit 7%

Deze opdrachten doen het werk op de opdrachtprompt zonder de bestanden in de lokale repository te wijzigen.

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote

Antwoord 4, autoriteit 4%

Wat dit voor mij oploste was in de root van je git repo (niet de submodule), voer

uit

rm -rf .git/modules/yourmodule

Dan zou je normaal moeten kunnen toevoegen.


Antwoord 5, autoriteit 2%

De gemakkelijkste manier die ik vond is deze:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Ik vond het niet leuk om mijn .gitmoduleshandmatig aan te passen. Ik heb er ook een kleine blogpostover geschreven.


Antwoord 6

Als u de externe URL alleen voor deze kloonwilt wijzigen:

git config submodule."$submodule_name".url "$new_url"

Dit heeft geen invloed op het bestand .gitmodulesin het bovenliggende project, dus het wordt niet doorgegeven aan andere ontwikkelaars.

Dit wordt hierbeschreven als “gebruikersspecifieke recordwijzigingen”.

Voer nietgit submodule syncuit, want dan wordt de standaard-URL weer teruggezet.

Other episodes