Hoe vervang ik een git-submodule door een andere git-repo?
Specifiek heb ik een submodule:
- bevindt zich op
./ExternalFrameworks/TestFramework
die 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:
- Wijzig uw
.gitmodule
bestand om de nieuwe URL te gebruiken - Verwijder de map submodule in de repo
rm -rf .git/modules/<submodule>
- Verwijder de map submodule in de werkmap
rm -rf <submodule>
- Voer
git submodule sync
- Voer
git submodule update
uit
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
.gitmodules
bestand - Verwijder de relevante sectie uit
.git/config
- Voer
git rm --cached path_to_submodule
uit (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/config
voor 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 .gitmodules
handmatig 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 .gitmodules
in het bovenliggende project, dus het wordt niet doorgegeven aan andere ontwikkelaars.
Dit wordt hierbeschreven als “gebruikersspecifieke recordwijzigingen”.
Voer nietgit submodule sync
uit, want dan wordt de standaard-URL weer teruggezet.