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.