Czy istnieje sposób na pobranie tylko jednego konkretnego zatwierdzenia ze zdalnego repozytorium Git bez klonowania go na moim komputerze? Struktura zdalnego repo jest absolutnie taka sama jak moja, a zatem nie będzie żadnych konfliktów, ale nie mam pojęcia, jak to zrobić i nie chcę klonować tego ogromnego repozytorium.
Jestem nowy na git, czy jest jakiś sposób?
Odpowiedzi:
Począwszy od Gita w wersji 2.5+ (Q2 2015), pobieranie pojedynczego zatwierdzenia (bez klonowania pełnego repozytorium) jest faktycznie możliwe.
Zobacz commit 68ee628, autor: Fredrik Medley (
moroten
) , 21 maja 2015 r.(Scalony przez Junio C Hamano -
gitster
- w commit a9d3493 , 01 czerwca 2015)Masz teraz nową konfigurację (po stronie serwera)
Jeśli połączysz tę konfigurację po stronie serwera z płytkim klonowaniem (
git fetch --depth=1
), możesz poprosić o pojedynczy zatwierdzenie (patrzt/t5516-fetch-push.sh
:Możesz użyć
git cat-file
polecenia, aby zobaczyć, że zatwierdzenie zostało pobrane:Pełna dokumentacja to:
Git 2.6 (III kwartał 2015) ulepszy ten model.
Zobacz zatwierdzenie 2bc31d1 , zatwierdzenie cc118a6 (28 lipca 2015 r.) Autor: Jeff King (
peff
) .(Połączone przez Junio C Hamano -
gitster
- w commit 824a0be , 19 sierpnia 2015)Git 2.7 (listopad / grudzień 2015) poprawi się ponownie:
Zobacz zatwierdzenie 948bfa2 , zatwierdzenie 00b293e (05 listopada 2015), zatwierdzenie 78a766a , zatwierdzenie 92cab49 , zatwierdzenie 92cab49 , zatwierdzenie 92cab49 (03 listopada 2015), zatwierdzenie 00b293e , zatwierdzenie 00b293e (05 listopada 2015) i zatwierdzenie 92cab49 , zatwierdzenie 92cab49 , zatwierdzenie 92cab49 , commit 92cab49 (03 listopada 2015) autor: Lukas Fleischer (
lfos
) .Pomógł: Eric Sunshine (
sunshineco
) .(Scalony przez Jeff King -
peff
- in commit dbba85e , 20 listopada 2015)Stąd nowa dokumentacja :
R .. wspomina w komentarzach o konfiguracji
uploadpack.allowAnySHA1InWant
, która pozwalaupload-pack
zaakceptowaćfetch
żądanie, które w ogóle prosi o dowolny obiekt. (Domyślniefalse
).Zobacz commit f8edeaa (listopad 2016, Git v2.11.1) autorstwa Davida „novalis” Turnera (
novalis
) :źródło
uploadpack.allowAnySHA1InWant
kary obliczeniowej osiągalności (i wektora DoS).Klonujesz tylko raz, więc jeśli masz już klon zdalnego repozytorium, wyciągnięcie go z niego nie spowoduje ponownego pobrania wszystkiego. Po prostu wskaż gałąź, którą chcesz pobrać, lub pobierz zmiany i sprawdź, czy chcesz zatwierdzić.
Pobieranie z nowego repozytorium jest bardzo duże tanie pod względem przepustowości, ponieważ pobiera tylko te zmiany, których nie masz. Zastanów się, czy Git robi właściwe rzeczy przy minimalnym obciążeniu.
Git przechowuje wszystko w
.git
folderze. Zatwierdzenie nie może zostać pobrane i zapisane w izolacji, potrzebuje wszystkich swoich przodków. Są ze sobą powiązane .Aby zmniejszyć rozmiar pobierania, możesz jednak poprosić git o pobranie tylko obiektów powiązanych z określoną gałęzią lub zatwierdzenie:
Spowoduje to pobranie tylko zatwierdzeń zawartych w zdalnym oddziale
branch
(i tylko tych, za którymi tęsknisz) i zapisanie ichorigin/branch
. Następnie możesz scalić lub pobrać.Możesz także określić tylko zatwierdzenie SHA1:
Spowoduje to pobranie tylko zatwierdzenia określonego SHA-1 96de5297df870 (i jego brakujących przodków) i zapisanie go jako (nieistniejącej) gałęzi zdalnej
origin/foo-commit
.źródło
2.7.4-0ubuntu1.3
. Jednak w przypadku korzystania2.16.2-0ppa1~ubuntu16.04.1
z git-core PPA działa to tak, jak powinno. Brzmi jak naprawiony błąd. Nie można znaleźć odniesienia do tego za pomocą szybkiego wyszukiwania. Jeśli ktoś może mi w tym wskazać, chciałbym przywrócić tę poprawkę.Wykonałem repozytorium git:
Pozwalając gitowi pobrać cały kod dla gałęzi, a potem poszedłem zresetować interesujący mnie zatwierdzenie.
git reset --hard <commit-hash>
Mam nadzieję że to pomoże.
źródło
git reset --hard
, gdy są udostępniane w uogólnionych rozwiązaniach, mogą prowadzić ludzi do pułapek, w których tracą dane (lub, w tym przypadku: w stanie, w którym odzyskanie danych nie jest łatwe).Możesz po prostu pobrać pojedyncze zatwierdzenie zdalnego repo za pomocą
gdzie,
<repo>
może być nazwą zdalnego repozytorium (np.origin
) lub nawet zdalnym adresem URL repozytorium (np.https://git.foo.com/myrepo.git
)<commit>
może być zatwierdzeniem SHA1na przykład
po pobraniu zatwierdzenia (i brakujących przodków) możesz po prostu to sprawdzić
Pamiętaj, że spowoduje to przejście w stan „odłączonej głowy”.
źródło
fetch
uzyskać określoną wersję, tak jak ty, git kończy się niepowodzeniem z kodem błędu 1 i brakiem danych wyjściowych. Czy było to coś, co działało w poprzednich wersjach? (Jestem v2.0.2.)fetch
, ale w tym przypadku nie jestem pewien, do czego służy.git checkout FETCH_HEAD
pomaga--depth=1
)!Możesz po prostu pobrać zdalne repozytorium za pomocą:
gdzie,
<repo>
może być nazwą zdalnego repozytorium (np.origin
) lub nawet zdalnym adresem URL repozytorium (np.https://git.foo.com/myrepo.git
)na przykład:
po pobraniu repozytoriów możesz scalić wybrane zatwierdzenia (ponieważ pytanie dotyczy odzyskania jednego zatwierdzenia, zamiast scalenia możesz użyć wybrania wiśniowego, aby wybrać tylko jedno zatwierdzenie):
<commit>
może być zatwierdzeniem SHA1na przykład:
lub
jeśli jest to ostatnie zatwierdzenie, które chcesz scalić, możesz również użyć zmiennej FETCH_HEAD:
źródło
git config set uploadpack.allowReachableSHA1InWant
?Działa to najlepiej:
nazwij „temp” cokolwiek chcesz… gałąź ta może być jednak osierocona
źródło
Wreszcie znalazłem sposób na sklonowanie konkretnego zatwierdzenia za pomocą git cherry-pick . Zakładając, że nie masz lokalnego repozytorium i pobierasz określone zmiany ze zdalnego,
1) utwórz puste repozytorium w lokalnych i git init
2) „ url-of-repository ” git remote add origin ”
3) początek pobierania git [nie przeniesie twoich plików do lokalnego obszaru roboczego, chyba że się scalisz]
4) git cherry-pick " Enter-long-commit-hash-that-you-need ”
Gotowe. W ten sposób będziesz mieć tylko pliki z tego konkretnego zatwierdzenia w twoim lokalnym.
Enter-long-commit-hash:
Możesz to uzyskać za pomocą -> git log --pretty = oneline
źródło
Myślę, że „git ls-remote” ( http://git-scm.com/docs/git-ls-remote ) powinien robić, co chcesz. Bez pobierania siły lub ciągnięcia.
źródło
Jeśli żądane zatwierdzenie znajduje się w żądaniach ściągania zdalnego repozytorium, możesz uzyskać je według jego identyfikatora:
źródło