Git
submoduler
Sök…
Lägga till en undermodul
Du kan inkludera ett annat Git-arkiv som en mapp i ditt projekt, spårat av Git:
$ git submodule add https://github.com/jquery/jquery.git
Du bör lägga till och begå den nya .gitmodules
filen; detta säger Git vilka submoduler som ska klonas när git submodule update
körs.
Kloning av ett Git-arkiv med submoduler
När du klonar ett arkiv som använder undermoduler måste du initiera och uppdatera dem.
$ git clone --recursive https://github.com/username/repo.git
Detta kommer att klona de refererade submodulerna och placera dem i lämpliga mappar (inklusive submoduler i submoduler). Detta motsvarar körning av git submodule update --init --recursive
omedelbart efter att klonen är klar.
Uppdatera en submodul
En undermodul hänvisar till ett specifikt åtagande i ett annat arkiv. För att kolla in det exakta tillståndet som det hänvisas till för alla undermoduler, kör
git submodule update --recursive
Ibland istället för att använda det tillstånd som det hänvisas till vill du uppdatera till din lokala kassa till det senaste läget för den undermodulen på en fjärrkontroll. För att kolla in alla undermoduler till det senaste tillståndet på fjärrkontrollen med ett enda kommando kan du använda
git submodule foreach git pull <remote> <branch>
eller använd standard- git pull
argument
git submodule foreach git pull
Observera att detta bara kommer att uppdatera din lokala arbetskopia. Att köra git status
listar katalogen för undermodulen som smutsig om den ändrades på grund av detta kommando. För att uppdatera ditt arkiv för att referera till det nya tillståndet i stället måste du göra ändringarna:
git add <submodule_directory>
git commit
Det kan vara några ändringar du har som kan ha sammanslagningskonflikt om du använder git pull
så att du kan använda git pull --rebase
att spola tillbaka dina ändringar till toppen, för det mesta minskar chansen för konflikt. Dessutom drar det alla grenar till lokalt.
git submodule foreach git pull --rebase
För att kolla in det senaste tillståndet för en specifik undermodul kan du använda:
git submodule update --remote <submodule_directory>
Ställer in en undermodul för att följa en gren
En undermodul checkas alltid ut vid en specifik engagemang SHA1 ("gitlänken", speciell post i indexet för överordnad repo)
Men man kan begära att uppdatera den undermodulen till den senaste åtagandet från en gren av undermodulens fjärrrepo.
Istället för att gå i varje undermodul, göra en git checkout abranch --track origin/abranch, git pull
, kan du helt enkelt göra (från förälderrepo):
git submodule update --remote --recursive
Eftersom undermodulens SHA1 skulle ändras måste du fortfarande följa det med:
git add .
git commit -m "update submodules"
Det antar att undermodulerna var:
antingen läggs till med en gren att följa:
git submodule -b abranch -- /url/of/submodule/repo
eller konfigurerad (för en befintlig undermodul) för att följa en gren:
cd /path/to/parent/repo git config -f .gitmodules submodule.asubmodule.branch abranch
Ta bort en undermodul
Du kan ta bort en undermodul (t.ex. the_submodule
) genom att ringa:
$ git submodule deinit the_submodule
$ git rm the_submodule
git submodule deinit the_submodule
raderarthe_submodule
s post från .git / config. Detta utesluter_submodulen frångit submodule update
git submodule sync
ochgit submodule foreach
och raderar dess lokala innehåll (källa) . Detta kommer inte att visas som förändring i ditt förälderslager.git submodule init
ochgit submodule update
kommer att återställa undermodulen, igen utan trevliga förändringar i ditt överlager.git rm the_submodule
bort undermodulen frångit rm the_submodule
. Filerna kommer att försvinna såväl som undermodulens post i filen.gitmodules
(källa) . Om baragit rm the_submodule
(utan tidigaregit submodule deinit the_submodule
körs, kommer emellertid submodulens post i din .git / config-fil att förbli.
Hämtad härifrån :
- Ta bort relevant avsnitt från
.gitmodules
filen. -
.gitmodules
ändrargit add .gitmodules
- Radera relevant avsnitt från
.git/config
. - Kör
git rm --cached path_to_submodule
(inget släpstänk). - Kör
rm -rf .git/modules/path_to_submodule
- Commit
git commit -m "Removed submodule <name>"
- Radera de nu ospårade undermodulfilerna
-
rm -rf path_to_submodule
Flytta en undermodul
Springa:
$ git mv old/path/to/module new/path/to/module
1,8 Redigera .gitmodules
och ändra undermodulens sökväg på lämpligt sätt och lägg den i indexet med git add .gitmodules
.
Skapa vid behov moderkatalogen för den nya platsen för undermodulen ( mkdir -p new/path/to
).
Flytta allt innehåll från den gamla till den nya katalogen ( mv -vi old/path/to/module new/path/to/submodule
).
Se till att Git spårar den här katalogen ( git add new/path /to
).
Ta bort den gamla katalogen med git rm --cached old/path/to/module
.
Flytta katalogen .git/modules/ old/path/to/module
med allt dess innehåll till .git/modules/ new/path/to/module
.
Redigera .git/modules/ new/path/to /config
filen, se till att arbetsbordsobjektet pekar på de nya platserna, så i det här exemplet ska det vara worktree = ../../../../../ old/path/to/module
. Vanligtvis borde det finnas ytterligare två ..
sedan kataloger i direktvägen på den platsen. . Redigera filen new/path/to/module /.git
, se till att sökvägen i den pekar på rätt ny plats i huvudprojektet .git
mappen, så i det här exemplet gitdir: ../../../.git/modules/ new/path/to/module
.
git status
statusutgång ser ut så här efteråt:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: .gitmodules
# renamed: old/path/to/submodule -> new/path/to/submodule
#
Slutligen begå ändringarna.
Detta exempel från Stack Overflow , av Axel Beckert
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow