git ดึงการแก้ไขเฉพาะจากที่เก็บระยะไกล


56

เรามี repo git ระยะไกลที่ปกติแล้วเราจะปรับใช้จากการใช้git pushบนเซิร์ฟเวอร์ dev ของเราแล้วgit pullบนเซิร์ฟเวอร์สดของเราเพื่อรับ repo รุ่นล่าสุด

แต่ถ้าเรามีความมุ่งมั่นและผลักดันการแก้ไขบางอย่าง (โดยไม่ต้องgit pullอยู่บนเซิร์ฟเวอร์ที่ใช้งานจริง) เราจะทำสิ่งgit pullที่อ้างถึงคำมั่นสัญญาเก่าที่เราต้องการได้อย่างไร

นั่นคือสิ่งที่ชอบ git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

คำตอบ:


64

เมื่อคุณดึงที่เก็บคุณควรจะไป:

git checkout 3ef0d...

1
นีซมันทำงานได้อย่างสมบูรณ์ นอกจากนี้ยังพบว่าถ้าผมต้องการที่จะได้รับกลับในซิงค์สำหรับอนาคตดึงฉันต้องระบุเซิร์ฟเวอร์ระยะไกลเมื่อทำดึงต่อไป (เช่นgit pull server:repoVS ปกติgit pull)
dlrust

1
บางที OP ถามคำถามผิด แต่สำหรับฉันมันเป็นคำถามที่ถูกต้องและนี่ไม่มีคำตอบ มีความมุ่งมั่นเฉพาะบนเซิร์ฟเวอร์ที่ขาดหายไปในเครื่อง การกระทำไม่ได้เป็นส่วนหนึ่งของสาขาหรือของแท็กและมันไม่ได้ถูกดึง / ดึงข้อมูล วิธีดึงข้อมูลการส่งข้อมูลที่เฉพาะเจาะจง
BlackEye

8

uploadpack.allowReachableSHA1InWant

เนื่องจากGit 2.5.0ตัวแปรการกำหนดค่านี้สามารถเปิดใช้งานบนเซิร์ฟเวอร์ได้ที่นี่คำขอคุณลักษณะ GitHubและGitHub ยอมรับการเปิดใช้งานคุณลักษณะนี้

Bitbucket Server เปิดใช้งานตั้งแต่รุ่น 5.5 ขึ้นไป

การใช้งาน:

# 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

หากกระบวนการบางอย่างบนเซิร์ฟเวอร์ที่ใช้งานจริงของคุณเข้าถึงเนื้อหาที่เพิ่งดึง (เช่นคุณไม่สามารถทำงานได้git checkout 3ef0dหลังจากดึง) คุณควรพิจารณาติดแท็กเวอร์ชันที่คุณต้องการปรับใช้ในการผลิตและชำระเงินโดยเฉพาะแท็กนั้นสำหรับการผลิต เปลี่ยนไดเรกทอรีทำงานของคุณ ไม่เช่นนั้นคุณอาจเสี่ยงต่อการมีใครบางคนผลักก่อนที่จะถึงมือ


1

โปรดทราบว่า git pull git checkout my-old-commit ตอนนี้ทำให้คุณอยู่ในสถานะถอดออกได้อย่างมีประสิทธิภาพ - คุณกำลังส่งคำมั่นสัญญาในอนาคตในที่เก็บนี้ลงในพา ธ การคอมมิทใหม่ สำหรับ repo การปรับใช้นี่ไม่ใช่ปัญหาใหญ่เนื่องจากคอมมิตเท่านั้นที่ควรถูกคอมมิตอย่างถูกต้องก่อนถูกดึง

อย่างไรก็ตามบางครั้งมันมีประโยชน์ในการตรวจสอบว่าเครื่องหมายการกระทำ (หัว, แท็ก, รีโมท) มีลักษณะเหมือนต้นแบบ repo ในการแก้ไขปัญหาดังต่อไปนี้การชำระเงินของคุณ: git reset - แนบหัวอีกครั้ง git fetch - ซิงค์เครื่องหมายสำหรับการควบคุมระยะไกล [ซึ่งอาจขึ้นอยู่กับเวอร์ชันคอมไพล์ - ยอมรับว่าสภาพแวดล้อมของเรายังคงอยู่ที่ 1.7 ... ดังนั้นอาจไม่จำเป็นอีกต่อไป YMMV]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.