git ściągnij konkretną wersję ze zdalnego repozytorium

56

Mamy zdalne repozytorium git, które normalnie wdrażamy, wykorzystując git pushna naszym serwerze deweloperskim, a następnie git pullna naszych serwerach na żywo, aby uzyskać najnowszą wypchniętą wersję repozytorium.

Ale jeśli popełniliśmy i wypuściliśmy kilka poprawek (bez opcji git pullna serwerach na żywo), w jaki sposób możemy zrobić, git pullże odnosi się do starszego zatwierdzenia, które chcemy?

tj. coś podobnego git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

dlrust
źródło

Odpowiedzi:

64

Po wyciągnięciu repozytorium powinieneś być w stanie przejść:

git checkout 3ef0d...
Scott Muc
źródło
1
Fajnie, działało idealnie. Zauważyłem również, że jeśli chcę ponownie zsynchronizować przyszłe ściągnięcia, muszę określić serwer zdalny podczas następnego ściągania (tj. W git pull server:repoporównaniu do zwykłego git pull)
dlrust
1
Może OP zadał niewłaściwe pytanie, ale dla mnie jest to prawidłowe pytanie i to nie jest odpowiedź. Na serwerze brakuje określonego zatwierdzenia, którego brakuje lokalnie. Zatwierdzenie nie jest częścią gałęzi ani tagu i nie jest przesyłane za pomocą pull / fetch. Jak pobrać konkretny zatwierdzenie?
BlackEye
8

uploadpack.allowReachableSHA1InWant

Od wersji Git 2.5.0 tę zmienną konfiguracyjną można włączyć na serwerze, tutaj żądanie funkcji GitHub i zatwierdzenie GitHub włączające tę funkcję .

Serwer Bitbucket włączył go od wersji 5.5+ .

Stosowanie:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
Ciro Santilli
źródło
2

Jeśli jakiś proces na twoim serwerze na żywo natychmiast uzyskuje dostęp do właśnie pobranej zawartości (tzn. Nie możesz pracować git checkout 3ef0dpo ściągnięciu), powinieneś rozważyć oznakowanie wersji, którą chcesz wdrożyć w produkcji, a konkretnie wypisanie tego tagu na produkcji, aby pobieranie nie było natychmiast zmień katalog roboczy. W przeciwnym razie ryzykowałbyś, że ktoś pcha tuż przed twoim pociągnięciem.

Olaf
źródło
1

Zauważ, że git pull git checkout my-old-commit teraz pozostawia cię w stanie ODŁĄCZONEJ GŁOWICY - w efekcie wysyłasz przyszłe zatwierdzenia w tym repozytorium nową ścieżką zatwierdzania. W przypadku repozytorium wdrażania nie jest to poważny problem, ponieważ jedynymi zatwierdzeniami powinny być te, które zostały już poprawnie zatwierdzone przed pobraniem.

Czasami jednak przydatne jest sprawdzenie, czy znaczniki zatwierdzeń (head, tagi, piloty) wyglądają identycznie jak master repo. Aby to naprawić, wykonaj następujące czynności: git reset - ponownie podłącza głowę git fetch - synchronizuje markery dla pilotów [może to zależeć od wersji git - co prawda nasze środowisko jest wciąż w wersji 1.7 ... więc może nie być już wymagane YMMV]

Simon Coleman
źródło