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?

Nathan H.
źródło
2
To może nie odpowiedzieć na wszystkie twoje pytania, ale jest interesujące czytanie na ten temat: blogs.atlassian.com/2013/05/...
Chop
Podobne pytanie to stackoverflow.com/questions/571232/…
Michael Freidgeim
"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.


VonC
źródło
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
351

podmoduł to link;

poddrzewo to kopia

Feng
źródło
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.

Niklas P.
źródło
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

Maciek Rek
źródło
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