Poddrzewo Git: alternatywa dla modułu podrzędnego Git
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.
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żywaszpoddrzewa 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.
materiały pokrewne
Jak przenieść pełne repozytorium Git
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.
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.