Blog GitHub

ostatecznie każdy interesujący projekt programistyczny będzie zależał od innego projektu, biblioteki lub frameworka. Git dostarcza moduły podrzędne, które pomogą w tym. Moduły podrzędne umożliwiają dołączenie lub osadzenie jednego lub więcej repozytoriów jako podfolderu w innym repozytorium.

w przypadku wielu projektów moduły podrzędne nie są najlepszą odpowiedzią (więcej na ten temat poniżej), a nawet w najlepszym przypadku praca z modułami podrzędnymi może być trudna, ale zacznijmy od prostego przykładu.,

dodawanie podmodułu

Załóżmy, że pracujesz nad projektem o nazwie Slingshot. Masz kod y-shaped stick I rubber-band.


zdjęcie flickr udostępnione przez young@art na licencji Creative Commons ( BY)

w tym samym czasie, w innym repozytorium, masz inny projekt o nazwie Rock—to tylko ogólna bibliotekarock, ale myślisz, że będzie idealny do procy.

możesz dodaćrock jako podmodułslingshot., W slingshot repozytorium:

w tym momencie będziesz miał rock folder wewnątrz slingshot, ale jeśli chcesz zajrzeć do tego folderu, w zależności od wersji Git, możesz zobaczyć … nic.,

nowsze wersje Gita zrobią to automatycznie, ale starsze wersje wymagają wyraźnego polecenia Git, aby pobrać zawartośćrock:

Jeśli wszystko wygląda dobrze, możesz zatwierdzić tę zmianę i będziesz miećrock folder w folderzerockslingshot repozytorium zawierające całą zawartość z repozytorium rock.,

na Githubie ikona folderu rock będzie miała mały wskaźnik pokazujący, że jest to podmoduł:

i kliknięcie na folder rock przeniesie Cię do folderu rock

To jest to! Osadzono repozytorium rock wewnątrz repozytorium slingshot. Możesz wchodzić w interakcje z całą zawartością z rocktak, jakby był to folder wewnątrz slingshot (ponieważ jest).,

w wierszu poleceń polecenia Git wydane z slingshot (lub dowolnego innego folderu, rubber-band I y-shaped-stick) będą działać na „macierzystym repozytorium”, slingshot, ale polecenia, które wydajesz z folderu rock będą działać tylko na rock repozytorium:

dołączanie do projektu za pomocą modułów podrzędnych

teraz, powiedzmy, że jesteś nowym współpracownikiem dołączającym do projektu proca., Zacznij od uruchomieniagit clone, aby pobrać zawartość repozytoriumslingshot. W tym momencie, jeśli zajrzysz do folderu rock, zobaczysz … nic.

ponownie, Git oczekuje, że wyraźnie poprosimy go o pobranie zawartości podmodułu., Możesz użyć git submodule update --init --recursive tutaj również, ale jeśli klonujesz slingshot po raz pierwszy, możesz użyć zmodyfikowanego polecenia clone, aby upewnić się, że pobierzesz wszystko, łącznie z dowolnymi modułami:

przełączanie na moduły podrzędne

może być trochę trudne, aby wziąć istniejący podfolder i przekształcić go w zewnętrzną zależność. Spójrzmy na przykład.

masz zamiar rozpocząć nowy projekt—magiczną puszkę-która również potrzebuje rubber-band., Weźmy rubber-band, który zbudowałeś dla slingshot, podziel go na samodzielne repozytorium, a następnie Osadź go w obu projektach za pomocą modułów podrzędnych.

możesz pobrać wszystko z folderurubber-band I rozpakować je do nowego repozytorium, a nawet zachować historię zatwierdzeń.

Zacznijmy od wyodrębnienia zawartości folderurubber-bandzslingshot., Możesz użyć git filter-branch, pozostawiając tylko commity związane z rubber-band. Polecenie git filter-branch przepisze historię naszego repozytorium, sprawiając, że będzie wyglądało tak, jakby folder rubber-band był przez cały czas jego własnym repozytorium. Więcej informacji na temat git filter-branch można znaleźć w tym artykule.

pierwszym krokiem jest zrobienie kopiislingshot do pracy nad—celem końcowym jest, abyrubber-band stał się własnym repozytorium, więc pozostawslingshot tak, jak jest., Możesz użyć cp z -r aby rekurencyjnie skopiować cały slingshot folder do nowego folderu rubber-band.,

wygląda na to, że rubber-band jest tylko kolejnym slingshot, ale teraz, z rubber-band repozytorium, Uruchom git filter-branch:

w tym momencie będziesz miał folder rubber-band, który jest repozytorium, które przypomina procę projektu, ale zawiera tylko pliki i historię zatwierdzeń z folderu rubber-band.,

ponieważ skopiowałeś to zslingshot, nowe repozytorium nadal będzie miało wszystkie zdalne gałęzie śledzenia, które skonfigurowałeś, gdy było slingshot. Nie chcesz wcisnąć rubber-band z powrotem na slingshot. Chcesz przenieść to do nowego repozytorium.

Utwórz nowe repozytorium dlarubber-band na Githubie, a następnie zaktualizuj zdalne repozytorium dla rubber-band., Zakładając, że wywołałeś zdalny origin, możesz:

Możesz opublikować nowy „generic rubber-band module” za pomocą git push.,

teraz, gdy oddzieliłeś rubber-band do własnego repozytorium, musisz usunąć stary rubber-band folder z slingshot repozytorium:

następnie zaktualizuj slingshot aby użyć rubber-band jako podmodułu:

jak widzieliśmy wcześniej, gdy dodawaliśmy rock, mamy teraz repozytorium w repozytorium., W rzeczywistości trzy repozytoria: repozytorium nadrzędne slingshot, plus dwa repozytoria podrzędne, rock I rubber-band.

ponadto, jeśli wrócimy do historii slingshot, zobaczymy commity, które pierwotnie wprowadziliśmy dorubber-band kiedy był to folder—usunięcie folderu nie wymazało żadnej z historii., Może to być czasami trochę mylące—ponieważ repozytoriumrubber-band „child” ma skopiowaną i zmodyfikowaną wersję tych starych commitówslingshot, czasami może się wydawać, że masz Deja vu.

Niestety, każdy współpracownik, który ściągnieslingshot w tym momencie będzie miał pustyrubber-band folder., Możesz przypomnieć współpracownikom o uruchomieniu tego polecenia, aby upewnić się, że mają całą zawartość podmodule:

będziesz również chciał dodać podmodule rubber-band do magic roll-back can. Na szczęście, wszystko, co musisz zrobić, to postępować zgodnie z tą samą procedurą, której użyłeś wcześniej, gdy dodałeś rockdo slingshot, w ” dodawaniu podmodułu.”

Porady dotyczące używania podmodułów (lub nie)

  • zanim dodasz repozytorium jako podmoduł, najpierw sprawdź, czy masz lepszą alternatywę., Moduły podrzędne Git działają wystarczająco dobrze w prostych przypadkach, ale w dzisiejszych czasach często dostępne są lepsze narzędzia do zarządzania zależnościami niż te, które mogą zaoferować moduły podrzędne Git. Współczesne języki, takie jak Go, mają od samego początku wbudowane przyjazne, świadome Git systemy zarządzania zależnościami. Inne, jak Ruby ' s rubygems, Node.js 'npm, czyli Cocoa' s CocoaPods i Carthage, zostały dodane przez społeczność programistów. Nawet Programiści front-end mają narzędzia takie jak Bower do zarządzania bibliotekami i frameworkami dla JavaScript i CSS po stronie klienta.
  • pamiętaj, że Git domyślnie nie pobiera zawartości podmodułu., Jeśli dodajesz podmoduł do istniejącego projektu, upewnij się, że każdy, kto pracuje nad projektem, wie, że musi uruchomić polecenia takie jak git submodule updateI git clone --recursive, aby mieć pewność, że otrzyma wszystko—obejmuje to wszystkie zautomatyzowane usługi wdrażania lub testowania, które mogą być zaangażowane w projekt! Zalecamy używanie czegoś w rodzaju „skryptów do rządzenia nimi wszystkimi”, aby upewnić się, że wszyscy współpracownicy i usługi mają dostęp do tej samej zawartości repozytorium wszędzie.
  • moduły podrzędne wymagają starannego zrównoważenia spójności i wygody., Zastosowana tu konfiguracja zdecydowanie preferuje konsystencję, kosztem odrobiny wygody. Ogólnie najlepiej jest mieć podmoduły projektu zablokowane do określonego SHA, więc wszyscy współpracownicy otrzymują tę samą zawartość. Ale ta konfiguracja również utrudnia programistom w „macierzystym” repozytorium wprowadzanie zmian z powrotem do repozytorium podmodułu.
  • pamiętaj, że współpracownicy nie będą automatycznie widzieć aktualizacji podmodułów—jeśli zaktualizujesz podmoduł, może być konieczne przypomnienie kolegom o uruchomieniu git submodule update lub prawdopodobnie zobaczą dziwne zachowanie.,
  • Zarządzanie dynamicznymi, szybko rozwijającymi się lub silnie współzależnymi repozytoriami za pomocą podmodułów może szybko stać się frustrujące. Ten post koncentrował się na prostych, względnie statycznych relacjach repozytorium rodzic-dziecko. Przyszły post będzie szczegółowo opisywał niektóre strategie, aby pomóc w zarządzaniu bardziej złożonymi przepływami pracy podmodułów.

Czytaj dalej

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *