git kéo sửa đổi cụ thể từ kho lưu trữ từ xa


56

Chúng tôi có một repo git từ xa mà chúng tôi thường triển khai từ việc sử dụng git pushtrên máy chủ dev của chúng tôi sau đó git pulltrên các máy chủ trực tiếp của chúng tôi để có được phiên bản đẩy mới nhất của repo.

Nhưng nếu chúng tôi đã cam kết và thúc đẩy một vài sửa đổi (không có git pullmáy chủ trực tiếp), làm thế nào chúng tôi có thể thực hiện một git pullđề cập đến cam kết cũ hơn mà chúng tôi muốn?

tức là một cái gì đó như git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

Câu trả lời:


64

Khi bạn đã kéo kho lưu trữ, bạn sẽ có thể đi:

git checkout 3ef0d...

1
Đẹp, điều này làm việc hoàn hảo. Cũng lưu ý rằng nếu tôi muốn quay lại đồng bộ hóa cho các lần kéo trong tương lai, tôi cần chỉ định máy chủ từ xa khi thực hiện thao tác kéo tiếp theo (tức là git pull server:reposo với thông thường git pull)
dlrust

1
Có thể OP đã hỏi sai câu hỏi, nhưng đối với tôi đó là câu hỏi chính xác và đây không phải là câu trả lời. Có một cam kết cụ thể trên máy chủ bị thiếu cục bộ. Cam kết không phải là một phần của chi nhánh cũng không phải là thẻ và nó không bị cản trở khi kéo / tìm nạp. Làm thế nào để lấy một cam kết cụ thể?
BlackEye

8

uploadpack.allowReachableSHA1InWant

Git 2.5.0 , biến cấu hình này có thể được bật trên máy chủ, ở đây yêu cầu tính năng GitHubcam kết GitHub kích hoạt tính năng này .

Bitbucket Server đã kích hoạt nó kể từ phiên bản 5.5+ .

Sử dụng:

# 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"

2

Nếu một số quy trình trên máy chủ trực tiếp của bạn truy cập ngay vào nội dung vừa kéo (nghĩa là bạn không thể làm việc git checkout 3ef0dsau khi kéo), bạn nên xem xét gắn thẻ phiên bản bạn muốn triển khai trong sản xuất và kiểm tra cụ thể thẻ đó khi sản xuất, để việc kéo không ngay lập tức thay đổi thư mục làm việc của bạn. Nếu không, bạn có nguy cơ ai đó đẩy ngay trước khi bạn kéo.


1

Lưu ý rằng git pull git checkout my-old-commit bây giờ bạn sẽ ở trạng thái ĐẦU TIÊN XÁC ĐỊNH - thực tế là bạn đang gửi các cam kết trong tương lai trong kho lưu trữ này xuống một đường dẫn cam kết mới. Đối với một repo triển khai, đây không phải là một vấn đề lớn, vì các cam kết duy nhất phải là các cam kết đã được cam kết chính xác trước khi được kéo.

Tuy nhiên, đôi khi rất hữu ích để kiểm tra xem các dấu cam kết (đầu, thẻ, điều khiển từ xa) trông giống hệt với repo chính. Để khắc phục điều này sau khi thanh toán: git reset - gắn lại đầu git fetch - đồng bộ hóa các điểm đánh dấu cho điều khiển từ xa [đây có thể là phụ thuộc phiên bản git - phải thừa nhận rằng môi trường của chúng tôi vẫn ở trên 1.7 ... vì vậy có thể không còn yêu cầu YMMV]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.