Close

Poddrzewo Git: alternatywa dla modułu podrzędnego Git

Zdjęcie portretowe Nicoli Paolucci
NICOLA PAOLUCCI

Deweloper Advocate


W Internecie jest pełno artykułów o tym, dlaczego nie należy używać modułów podrzędnych Git. Chociaż moduły podrzędne są przydatne w kilku przypadkach użycia, mają wady.

Czy istnieją alternatywy? Odpowiedź brzmi „Tak”! Istnieją (przynajmniej) dwa narzędzia, które mogą pomóc w śledzeniu historii zależności oprogramowania w projekcie, jednocześnie umożliwiając korzystanie z Git:

  • Poddrzewo Git
  • Repozytorium Google

W tym poście przyjrzymy się funkcji poddrzewa Git i pokażemy, dlaczego jest lepsze, choć nie doskonałe, niż moduł podrzędny Git.

Czym jest poddrzewo Git i dlaczego warto go używać?


Poddrzewo Git pozwala zagnieździć jedno repozytorium w drugim jako podkatalog. Jest to jeden z kilku sposobów, w jaki można zarządzać zależnościami w projektach Git.

Diagram przed/po dla poddrzewa Git

Dlaczego warto rozważyć użycie poddrzewa Git

  • Zarządzanie prostym przepływem pracy jest łatwe.
  • Obsługiwane są starsze wersje Git (nawet starsze niż 1.5.2).
  • Kod projektu podrzędnego jest dostępny zaraz po zakończeniu klonowania projektu nadrzędnego.
  • Poddrzewo Git nie wymaga od użytkowników repozytorium nauki nowych umiejętności. Mogą zignorować fakt, że używasz poddrzewa Git do zarządzania zależnościami.
  • Poddrzewo Git nie dodaje nowych plików metadanych w przeciwieństwie do modułu podrzędnego Git (.gitmodule).
  • Zawartość modułu można modyfikować bez oddzielnej kopii repozytorium zależności w innym miejscu.

Wady (ale naszym zdaniem są w dużej mierze do zaakceptowania):

  • Musisz poznać nową strategię scalania (tzn. poddrzewo Git).
  • Dodawanie kodu z powrotem do repozytorium nadrzędnego dla podprojektów jest nieco bardziej skomplikowane.
  • Ty odpowiadasz za nie mieszanie kodu projektu nadrzędnego i podprojektu.
Bazy danych
materiały pokrewne

Jak przenieść pełne repozytorium Git

Logo Bitbucket
POZNAJ ROZWIĄZANIE

Poznaj środowisko Git z rozwiązaniem Bitbucket Cloud

Sposób użycia polecenia git subtree


Polecenie git subtree jest dostępne w podstawowej wersji systemu Git od maja 2012 r. — w wersji 1.7.11 i nowszych. Wersja zainstalowana przez homebrew na OSX ma już poprawnie skonfigurowany program subtree, ale na niektórych platformach może być konieczna instalacja zgodnie z instrukcjami.

Oto kanoniczny przykład śledzenia wtyczki vim za pomocą programu git subtree.

Szybki i uproszczony sposób bez zdalnego śledzenia

Jeśli chcesz tylko wyciąć i wkleić kilka pojedynczych wierszy kodu, przeczytaj ten akapit. Najpierw dodaj poddrzewo Git w określonym folderze prefiksu:

git subtree add --prefix .vim/bundle/tpope-vim-surround https://bitbucket.org/vim-plugins-mirror/vim-surround.git main --squash

(Powszechną praktyką jest nie przechowywanie całej historii podprojektu w repozytorium głównym, ale jeśli chcesz go zachować, po prostu pomiń oznaczenie --squash.)

Powyższe polecenie wyświetla następujące dane wyjściowe:

git fetch https://bitbucket.org/vim-plugins-mirror/vim-surround.git main
warning: no common commits
remote: Counting objects: 338, done.
remote: Compressing objects: 100% (145/145), done.
remote: Total 338 (delta 101), reused 323 (delta 89)
Receiving objects: 100% (338/338), 71.46 KiB, done.
Resolving deltas: 100% (101/101), done.
From https://bitbucket.org/vim-plugins-mirror/vim-surround.git
* branch main -} FETCH_HEAD
Added dir '.vim/bundle/tpope-vim-surround'

Jak widzimy, zapisany zostaje commit scalenia wskutek zesquashowania całej historii repozytorium vim-surround w jedną całość:

1bda0bd [3 minutes ago] (HEAD, stree) Merge commit 'ca1f4da9f0b93346bba9a430c889a95f75dc0a83' as '.vim/bundle/tpope-vim-surround' [Nicola Paolucci]
ca1f4da [3 minutes ago] Squashed '.vim/bundle/tpope-vim-surround/' content from commit 02199ea [Nicola Paolucci]

Aby po pewnym czasie zechcesz zaktualizować kod wtyczki z repozytorium upstream, możesz po prostu wykonać ściąganie kodu poddrzewa Git:

git subtree pull --prefix .vim/bundle/tpope-vim-surround https://bitbucket.org/vim-plugins-mirror/vim-surround.git main --squash

Jest to bardzo szybkie i bezbolesne, ale polecenia są nieco długie i trudne do zapamiętania. Możemy skrócić polecenia, dodając podprojekt jako repozytorium zdalne.

Dodawanie podprojektu jako repozytorium zdalnego

Dodanie poddrzewa jako repozytorium zdalnego pozwala nam odwoływać się do niego w krótszej formie:

git remote add -f tpope-vim-surround https://bitbucket.org/vim-plugins-mirror/vim-surround.git

Teraz możemy dodać poddrzewo (jak poprzednio) i odwołać się niego w skrócie:

git subtree add --prefix .vim/bundle/tpope-vim-surround tpope-vim-surround main --squash

Polecenie aktualizacji podprojektu w późniejszym terminie wygląda teraz tak:

git fetch tpope-vim-surround main
git subtree pull --prefix .vim/bundle/tpope-vim-surround tpope-vim-surround main --squash

Dodawanie kodu do repozytorium nadrzędnego

Możemy teraz swobodnie zatwierdzać nasze poprawki do podprojektu w naszym lokalnym katalogu roboczym. Kiedy nadejdzie czas na powrót do projektu nadrzędnego, musimy podzielić projekt i dodać go jako inne repozytorium zdalne:

git remote add durdn-vim-surround ssh://git@bitbucket.org/durdn/vim-surround.git

Teraz możemy użyć polecenia subtree push w następujący sposób:

git subtree push --prefix=.vim/bundle/tpope-vim-surround/ durdn-vim-surround main
git push using: durdn-vim-surround main
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 308 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
To ssh://git@bitbucket.org/durdn/vim-surround.git
02199ea..dcacd4b dcacd4b21fe51c9b5824370b3b224c440b3470cb -} main

Po tym jesteśmy gotowi i możemy przesłać pull request do opiekuna pakietu.

Czy mogę to zrobić bez użycia polecenia git subtree?

Tak, możesz. git subtree różni się od strategii scalania poddrzewa. Nadal możesz używać strategii scalania, nawet jeśli z jakiegoś powodu polecenie git subtree nie jest dostępne. Można to zrobić w ten sposób.

Dodaj zależność za pomocą prostego polecenia git remote:

git remote add -f tpope-vim-surround https://bitbucket.org/vim-plugins-mirror/vim-surround.git

Przed odczytaniem zawartości zależności do repozytorium, ważne jest, aby zarejestrować scalenie, aby móc mogli śledzić całą historię drzewa wtyczki do tego momentu:

git merge -s ours --no-commit tpope-vim-surround/main

Dane wyjściowe:

Automatic merge went well; stopped before committing as requested

Następnie odczytujemy zawartość najnowszego obiektu drzewa do repozytorium wtyczki do naszego katalogu roboczego gotowego do zatwierdzenia:

git read-tree --prefix=.vim/bundle/tpope-vim-surround/ -u tpope-vim-surround/main

Teraz możemy utworzyć commit (i będzie to zatwierdzenie scalania, które zachowa odczytaną historię drzewa):

git ci -m"[subtree] adding tpope-vim-surround"
[stree 779b094] [subtree] adding tpope-vim-surround

Aby zaktualizować projekt, możemy teraz ściągnąć kod za pomocą strategii scalania git subtree:

git pull -s subtree tpope-vim-surround main

Poddrzewo Git to świetna alternatywa


Po pewnym czasie używania modułów podrzędnych Git zobaczysz, że poddrzewo Git rozwiązuje wiele problemów z modułem podrzędnym Git. Jak w przypadku wszystkich rzeczy związanych z Git, trzeba poświęcić nieco czasu na naukę, aby w pełni wykorzystać tę funkcję.

Obserwuj mnie na Twitterze @durdn, aby dowiedzieć się więcej o Git. Wypróbuj Atlassian Bitbucket, jeśli szukasz dobrego narzędzia do zarządzania repozytoriami Git.

Aktualizacja: po opublikowaniu tego wpisu napisałem również artykuł o zaletach poddrzewa Git.

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


Udostępnij ten artykuł
Następny temat

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ludzie współpracujący przy ścianie pełnej narzędzi

Blog Bitbucket

Ilustracja DevOps

Ścieżka szkoleniowa DevOps

Demonstracje funkcji z ekspertami Atlassian

Zobacz, jak Bitbucket Cloud współpracuje z Atlassian Open DevOps

Zapisz się do newslettera DevOps

Thank you for signing up