Czy bezpieczne jest płytkie klonowanie za pomocą opcji --depth 1, tworzenie zatwierdzeń i ponowne pobieranie aktualizacji?

280

--depth 1Opcja w git clone:

Utwórz płytki klon z historią obciętą do określonej liczby wersji. Płytkie repozytorium ma wiele ograniczeń (nie można go klonować ani pobierać z niego, ani wypychać z niego ani do niego), ale jest wystarczające, jeśli interesuje Cię tylko najnowsza historia dużego projektu z długą historią i chciałbyś wysyłaj poprawki jako łatki.

Ale z powodzeniem wykonałem płytki klon, dokonałem pewnych zmian i przesunąłem te zmiany z powrotem do źródła (nagiego klonu).

Ma to dla mnie sens - to znaczy dlaczego nie? kiedy sklonowana GŁOWA jest możliwa do zidentyfikowania w pochodzeniu, a moje zatwierdzenie pojawia się poza tym, wydaje się, że nie ma żadnego powodu. Ale instrukcja mówi inaczej.

Podoba mi się pomysł płytkiego klonowania - np. Rdzenia drupala: nie ma mowy, żebym wiedział, co się działo w Drupal 4, kiedy zacząłem od 7. - ale nie chcę strzelać sobie w stopę.

Czy bezpieczne jest płytkie klonowanie, rozwijanie w nim zobowiązań, ciągnięcie ponownie, aby nadążać za aktualizacjami pochodzącymi z pochodzenia?

artfulrobot
źródło
13
Oto przyzwoita dyskusja na temat głębokości klonowania
Andy
Tak, też to przeczytałem, dzięki Andy. --orphankoncepcja wydaje się podobna i mam zamiar mieć luz. Nadal trochę zdenerwowany, że dokumenty nie pasują do rzeczywistości [bo kto ma powiedzieć, że dokumenty --orphansą poprawne ?!]
artfulrobot
Znalazłem kolejną świetną dyskusję na temat pracy ze skróconą historią . Ale to mi nie pomaga.
artfulrobot
1
Git 1.9 (Q1 2014) w pełni będzie wspierał płytkie klonowanie repo! Zobacz moją odpowiedź poniżej
VonC
1
Git 2.5 (Q2 2015) obsługuje zatwierdzenie pojedynczego pobrania! Zredagowałem swoją odpowiedź, odwołując się do „ Wyciągnij konkretny zatwierdzenie ze zdalnego repozytorium git ”.
VCC,

Odpowiedzi:

304

Pamiętaj, że Git 1.9 / 2.0 (Q1 2014) usunął to ograniczenie.
Zobacz commit 82fba2b , od Nguyễn Thái Ngọc Duy ( pclouds) :

Teraz, gdy git obsługuje przesyłanie danych z lub do płytkiego klonu, ograniczenia te nie są już prawdziwe.

Dokumentacja brzmi teraz :

--depth <depth>::

Utwórz „płytki” klon z historią obciętą do określonej liczby wersji.

Wynika to z zatwierdzeń takich jak 0d7d285 , f2c681c i c29a7b8, które obsługują klon, pakiet wysyłający / pakiet odbierający z / z płytkich klonów.
smart-http obsługuje teraz również płytkie pobieranie / klonowanie .

Wszystkie szczegóły znajdują się w „ shallow.c: 8 kroków, aby wybrać nowe zatwierdzenia dla.git/shallow ”.

Aktualizacja z czerwca 2015 r .: Git 2.5 pozwoli nawet na pobranie jednego zatwierdzenia !
(Ultimate płytka obudowa)


Aktualizacja styczeń 2016: Git 2.8 (Mach 2016) oficjalnie dokumentuje teraz praktykę uzyskania minimalnej historii.
Zobacz zatwierdzenie 99487cf , zatwierdzenie 9cfde9e (30 grudnia 2015 r.), Zatwierdzenie 9cfde9e (30 grudnia 2015 r.), Zatwierdzenie bac5874 (29 grudnia 2015 r.) I zatwierdzenie 1de2e44 (28 grudnia 2015 r.) Przez Stephen P. Smith (``) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 7e3e80a , 20 stycznia 2016)

To jest „ Documentation/user-manual.txt

A <<def_shallow_clone,shallow clone>>jest tworzony przez określenie git-clone --depthprzełącznika.
Głębokość można później zmienić za pomocą git-fetch --depthprzełącznika lub przywrócić pełną historię za pomocą--unshallow .

Scalanie wewnątrz <<def_shallow_clone,shallow clone>>będzie działało, o ile baza scalania znajduje się w najnowszej historii.
W przeciwnym razie będzie to jak łączenie niepowiązanych ze sobą historii i może być przyczyną ogromnych konfliktów.
To ograniczenie może spowodować, że takie repozytorium nie będzie odpowiednie do użycia w przepływach pracy opartych na scalaniu.

Aktualizacja 2020:

  • git 2.11.1 wprowadził opcję git fetch --shallow-exclude=zapobiegania pobieraniu całej historii
  • git 2.11.1 wprowadził opcję git fetch --shallow-since=zapobiegania pobieraniu starych zatwierdzeń.

Aby uzyskać więcej informacji na temat procesu aktualizacji płytkiego klonu, zobacz „ Jak zaktualizować płytki klon gita? ”.


Jak komentuje Richard Michael :

do wypełnienia historii: git pull --unshallow

A Olle Härstedt dodaje w komentarzach :

Aby zasypka część historii: git fetch --depth=100.

VonC
źródło
3
Tyle tekstu, by powiedzieć „ tak , o ile twoja wersja gita nie ma więcej niż 4 lata, a baza scalania znajduje się w najnowszej historii”
Boris
3
@ Boris ta odpowiedź bardzo mi pomogła, ponieważ sceptycznie podchodziłem do płytkiego klonowania. Poprzednio czasami się psuje, gdy dokonuję zatwierdzenia i scalenia. ta odpowiedź jest krótką historią, dlaczego teraz działa, kiedy to się dzieje, i jak to zrobić poprawnie.
Yana Agun Siswanto
6

Zobacz niektóre odpowiedzi na moje podobne pytanie dlaczego-cant-i-push-from-a-shallow-clone i link do ostatniego wątku na liście git.

Ostatecznie pomiar „głębokości” nie jest spójny między repozytoriami, ponieważ mierzą one z ich poszczególnych HEAD, a nie (a) twojej Głowy lub (b) klonowanych / zatwierdzonych przez Ciebie zatwierdzeń lub (c) czegoś innego miałeś na myśli

Najważniejsze jest, aby każdy przypadek użycia był odpowiedni (tj. Samowystarczalny), tak aby rozproszone, a zatem prawdopodobnie rozbieżne repo, nadal działałyby razem.

Wygląda na to, że checkout --orphanjest to właściwy etap „konfiguracji”, ale wciąż brakuje mu czystych (tj. Prostych, zrozumiałych poleceń w jednym wierszu) wskazówek dotyczących kroku „klonowania”. Wygląda raczej na to, że musisz wykonać initrepozytorium, założyć remotegałąź śledzenia (chcesz tylko jedną gałąź?), A następnie fetchtę pojedynczą gałąź, która wydaje się być od dawna pełna okazji do błędów.

Edycja: Aby uzyskać krok „klonowania”, zobacz tę odpowiedź

Philip Oakley
źródło
1
Czołgi Philip. Pobieranie zdalnego oddziału nadal będzie obejmować całą historię (AFAIK). Masz rację co do względnych głębokości, naprawdę chcę trochę odpowiedniego punktu w historii (jak w moim przypadku git merge-base 7.x 7.0)
artfulrobot
@artfulrobot: metoda „--orphan” pozwala utworzyć krótki wąski „klon” (tj. zogniskowany segment), a następnie użyć go tak, jakby był to właściwy repozytorium. To coś, czego jeszcze nie próbowałam ze złości, ale muszę to wkrótce udowodnić.
Philip Oakley,