git menarik revisi tertentu dari repositori jarak jauh

57

Kami memiliki repo git jarak jauh yang biasanya kami gunakan untuk digunakan git pushdi server dev kami lalu git pulldi server langsung kami untuk mendapatkan versi repo terdorong terbaru.

Tetapi jika kita telah melakukan dan mendorong beberapa revisi (tanpa git pullpada server langsung) bagaimana kita bisa melakukan git pullitu merujuk pada komitmen yang lebih lama yang kita inginkan?

yaitu sesuatu seperti git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

percaya
sumber

Jawaban:

64

Setelah Anda menarik repositori, Anda harus bisa:

git checkout 3ef0d...
Scott Muc
sumber
1
Bagus, ini bekerja dengan sempurna. Juga memperhatikan bahwa jika saya ingin kembali sinkron untuk tarikan di masa depan saya perlu menentukan server jauh ketika melakukan tarikan berikutnya (yaitu git pull server:repovs reguler git pull)
dlrust
1
Mungkin OP mengajukan pertanyaan yang salah, tetapi bagi saya itu adalah pertanyaan yang benar dan ini bukan jawaban. Ada komit khusus pada server yang hilang secara lokal. Komit bukan bagian dari cabang atau tag dan itu tidak disalahgunakan dengan tarikan / pengambilan. Bagaimana cara mengambil komit tertentu?
BlackEye
8

uploadpack.allowReachableSHA1InWant

Karena Git 2.5.0 variabel konfigurasi ini dapat diaktifkan di server, di sini permintaan fitur GitHub dan komit GitHub mengaktifkan fitur ini .

Bitbucket Server mengaktifkannya sejak versi 5.5+ .

Pemakaian:

# 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 新疆 改造 中心 法轮功 六四 事件
sumber
2

Jika beberapa proses pada server langsung Anda segera mengakses konten yang baru saja ditarik (yaitu Anda tidak dapat bekerja dengan git checkout 3ef0dsetelah menarik), Anda harus mempertimbangkan untuk menandai versi yang ingin Anda sebarkan dalam produksi dan secara khusus checkout tag itu pada produksi, sehingga penarikan tidak segera ubah direktori kerja Anda. Kalau tidak, Anda akan mengambil risiko seseorang mendorong sesaat sebelum menarik Anda.

Olaf
sumber
1

Perhatikan bahwa git pull git checkout my-old-commit sekarang membuat Anda dalam status HEAD DETACHED - efektif Anda mengirim komit masa depan dalam repositori ini ke jalur komit baru. Untuk repo penempatan ini bukan masalah besar, karena hanya komit yang harus dilakukan dengan benar sebelum ditarik.

Namun, kadang-kadang berguna untuk memeriksa bahwa penanda komit (head, tag, remote) terlihat identik dengan master repo. Untuk memperbaikinya setelah checkout Anda: git reset - pasang kembali kepala git fetch - sinkronisasi penanda untuk remote [ini mungkin tergantung versi git - memang lingkungan kita masih di 1,7 ... jadi mungkin tidak lagi diperlukan YMMV]

simon coleman
sumber