Różnice między podmodułem git a poddrzewem


300

Jakie są koncepcyjne różnice między użyciem podmodułu git i poddrzewa?

Jakie są typowe scenariusze dla każdego z nich?


2
To może nie odpowiedzieć na wszystkie twoje pytania, ale jest interesujące czytanie na ten temat: blogs.atlassian.com/2013/05/...
— Chop


"Alternatywy do git submodules?": Stackoverflow.com/questions/6500524/...
— brillout

Odpowiedzi:


177

Co jeśli chcę, aby linki zawsze wskazywały na HEAD zewnętrznego repo?

Możesz utworzyć submoduł, aby śledził HEAD oddziału zdalnego repozytorium submodułu, za pomocą:

o git submodule add -b <branch> <repository> [<path>]. (aby określić gałąź do naśladowania)
o, git submodule update --remotektóra <repository>/<branch>domyślnie zaktualizuje zawartość submodułu do najnowszej wersji HEAD origin/master. Twój główny projekt nadal będzie śledził skróty HEAD submodułu, nawet jeśli --remotejest używany.



twoja odpowiedź wydaje się być sprzeczna z głosowaną odpowiedzią tutaj: stackoverflow.com/questions/10443627/…
— Nathan H

@NathanH to (możliwość śledzenia głowie) został dodany rok później (marzec 2013 git 1.8.2: github.com/git/git/blob/... )
— VonC

Widzę, że zachowanie podrzędności podmodułu jest również wspomniane w twoim innym pytaniu . W takim przypadku myślę, że masz na myśli powiedzieć, że zawsze wskazanie HEAD submodułu odbywa się za pomocą obu poleceń, add -ba --remotepóźniej poleceń aktualizacji, zgodnie z dokumentacją aktualizacji submodułu . W takim razie, czy -bnaprawdę jest nadal potrzebny do podążania za GŁOWĄ mistrza?
— matanster

@matt -bsłuży do generowania odpowiednich metadanych .gitmodule dla submodułu (jest to odpowiednik a git config -f .gitmodules submodule.<path>.branch <branch>).
— VonC

Nie ma to nic wspólnego z włączaniem --remote- --remotedziała również, jeśli -bnie był używany add. W obu przypadkach aktualizacja spowoduje zatwierdzenie w repozytorium nadrzędnym zawierającym podmoduł, więc linki tak naprawdę „nie zawsze wskazują HEAD” w bardzo automatyczny sposób… albo go nie otrzymałem, albo to roszczenie lepiej być usunięte z oryginalnej odpowiedzi (?)
— Matanster


121

Różnica koncepcyjna to:

W podmodułach git zwykle chcesz rozdzielić duże repozytorium na mniejsze. Sposób odwoływania się do podmodułu jest podobny do stylu rajskiego - odwołujesz się do pojedynczego zatwierdzenia z drugiego repozytorium (podmodułu). Jeśli potrzebujesz zmiany w podmodule, musisz dokonać zatwierdzenia / wypchnięcia w podmodule, następnie odwołaj się do nowego zatwierdzenia w głównym repozytorium, a następnie zatwierdz / zmień zmienione odwołanie do głównego repozytorium. W ten sposób musisz mieć dostęp do obu repozytoriów dla pełnej kompilacji.

Z poddrzewem git integrujesz kolejne repozytorium w swoim, w tym jego historię. Więc po jego integracji rozmiar twojego repozytorium jest prawdopodobnie większy (więc nie jest to strategia zmniejszania repozytoriów). Po integracji nie ma połączenia z drugim repozytorium i nie potrzebujesz do niego dostępu, chyba że chcesz uzyskać aktualizację. Tak więc ta strategia dotyczy bardziej ponownego wykorzystania kodu i historii - ja osobiście jej nie używam.


Ale z git subtreetobą nadal możesz naciskać - jeśli chcesz - prawda?
— Ixx

@lxx Jeśli znasz adres URL repozytorium…
— Franklin Yu

@FranklinYu Dlaczego miałby tego nie wiedzieć? nie możesz uzyskać tych informacji z lokalnych metadanych git?
— adi518

@ adi518 Tak, jeśli jesteś tym, który utworzył poddrzewo. Jeśli jednak przekazałeś swoje repozytorium do GitHub, a inni sklonowali je, nie sądzę, że on / ona automatycznie zna adres URL poddrzewa.
— Franklin Yu

@NiklasP - czy możesz opracować „odwołanie do nowego zatwierdzenia w głównym repozytorium”? To jeden krok, który nie jestem pewien, jak wykonać, dlatego też „zmiana referencji” też nie jest czymś, co rozumiem.
— Robert Oschler,

21

podmoduł
wypychający główne repozytorium do pilota nie wypycha plików podmodułu

sub-drzewo
wypychające główne repozytorium do zdalnego wypycha pliki sub-drzewa


3
„wypychanie głównego repozytorium do zdalnych wypycha pliki poddrzewa” Nie, nie działa.
— J Bramble,

@JBramble Powinienem chyba wspomnieć, że zrobiono to z aplikacją SourceTree, np .:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
— Maciek Rek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.