Git - submoduły
Jak wdrożyć submoduł do własnego projektu?
Created Aug 11, 2022 - Last updated: Sep 12, 2022
Założenia:
- Mam własny serwer Git.
- Do projektu chcę wdrożyć submoduł a więc czyjeś repo.
- Chciałbym w drobnych fragmentach modyfikować kod z submodułu.
- Nadal chcę śledzić zmiany w mainie submodułu i móc je merge’ować z moimi zmianami.
Poniżej przykład realizacji strony w Hugo z wykorzystaniem submodułu - szablonu
Przygotowanie repo i wdrożenie submodułu:
git clone uri://server/project
cd project
hugo new site src
cd src
git submodule add https://github.com/paulmartins/hugo-digital-garden-theme.git themes/hugo-digital-garden-theme
git add archetypes config.toml
git commit
git push
cd src/themes/hugo-digital-garden-theme/
git remote add newbranchname uri://server/project
git checkout -b newbranchname
git remote set-url newbranchname uri://server/project
git push --set-upstream newbranchname newbranchname
Wyżej:
- uri://server/project - własny projekt trzymany na prywatnym serwerze
- src to katalog gdzie hugo tworzy początkową stronę
- newbranchname to branch, w którym wprowadzam własne zmiany
Pierwsze “clone” istniejącego repo z wdrożonym submodułem i własnym branchem:
git clone --recursive uri://server/project
cd project/src/themes/hugo-digital-garden-theme/
git remote add newbranchname uri://server/project
git checkout -b newbranchname
git remote add newbranchname uri://server/project
git remote set-url newbranchname uri://server/project
git pull newbranchname newbranchname
git push --set-upstream newbranchname newbranchname
Po zmodyfikowaniu pliku w submodule i zakomitowaniu tego na własnym serwerze może być problem z klonem na nowej maszynie. Pobranie aktualnej wersji submodułu:
git submodule update --force --recursive --init --remote
Wskazanie remote’a, w którym zapisano zmiany (patche) na moduł:
cd project/src/themes/hugo-digital-garden-theme
git checkout main
git remote add newbranchname uri://server/project
git remote set-url newbranchname uri://server/project
git branch -a
git pull newbranchname newbranchname
Merge następuje po ostatniej z powyższych komend.
Tymczasem na innym kompie trzeba pamiętać, żeby zrobić checkout na własnego brancha.
git checkout newbranchname
git pull
Czy da się prościej? Możliwe. Git czasami potrafi wykonać w jednym poleceniu kilka rzeczy.