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.