คอมไพล์ดึงการเปลี่ยนแปลงในท้องถิ่น


132

ฉันจะอัปเดต (ดึง) โครงการ git อย่างปลอดภัยได้อย่างไรโดยไม่ต้องแตะต้องไฟล์ใดไฟล์หนึ่งแม้ว่าจะมีการเปลี่ยนแปลงอัปสตรีม

myrepo / config / config.php

มีวิธีหรือไม่แม้ว่าไฟล์นี้จะมีการเปลี่ยนแปลงในระยะไกลเมื่อฉัน git ดึงทุกอย่างอื่นมีการปรับปรุง แต่ไฟล์นี้ไม่เปลี่ยนแปลง (ไม่รวมแม้)

PS ฉันต้องทำสิ่งที่ฉันขอเพราะฉันเขียนสคริปต์การปรับใช้ที่ใช้คอมไพล์เท่านั้น ฉันไม่สามารถเปลี่ยนไฟล์กำหนดค่าเป็นเทมเพลตได้

ดังนั้นฉันต้องการวิธีเขียนสคริปต์อัปเดตที่ไม่สูญเสียสิ่งที่เปลี่ยนแปลงในเครื่อง ฉันหวังว่าจะมีอะไรที่เรียบง่ายเหมือน:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

แล้วก็ git pull


เป็นการเปลี่ยนแปลงที่เกิดconfig.phpขึ้นหรือไม่?
Mark Longair


มันไม่ได้มุ่งมั่น ฉันอยากจะไม่ต้อง
Johnny Everson

@JhonnyEverson: มันเป็นระดับเดียวกันโดยรวมของปัญหา (คุณมีแฟ้มการกำหนดค่าและคุณไม่ต้องการที่จะกระทำการตั้งค่าเฉพาะ แต่ความต้องการโครงสร้างแฟ้มการกำหนดค่าที่จะติดตาม.)
Daenyth

คำตอบ:


248

มีวิธีแก้ไขอย่างง่ายตาม Git Stash ซ่อนทุกอย่างที่คุณเปลี่ยนแปลงดึงสิ่งใหม่ทั้งหมดนำที่เก็บของคุณไปใช้

git stash
git pull
git stash pop

ในป๊อปอัพที่เก็บของอาจมีข้อขัดแย้ง config.phpในกรณีที่คุณอธิบายมีในความเป็นจริงจะเป็นความขัดแย้งสำหรับ แต่การแก้ไขความขัดแย้งนั้นเป็นเรื่องง่ายเพราะคุณรู้ว่าสิ่งที่คุณใส่ลงไปคือสิ่งที่คุณต้องการ ดังนั้นทำสิ่งนี้:

git checkout --theirs -- config.php

5
เช็คเอาต์คอมไพล์นั้น - คำสั่งของพวกเขาสับสนมาก มันทำในสิ่งที่ฉันต้องการครั้งเดียวและบางครั้งก็แย่มากอีกครั้ง มีเอกสารที่ดีอยู่บ้างไหม?
Milimetric

3
ใช่บางครั้ง 'ของพวกเขา' และ 'ของเรา' อาจสร้างความสับสน ในgit merge'ของเรา' คือสิ่งที่อยู่ในไดเรกทอรีการทำงาน แต่สำหรับgit rebase(หรือgit rebase -onto) ความหมายสามารถเปลี่ยนได้
GoZoner

1
git stash , git pull , git stash apply คุณสามารถวางที่เก็บของไว้กับ: git stash dropเมื่อคุณรวมการเปลี่ยนแปลงเรียบร้อยแล้ว
BeingSuman

11
สิ่งที่มีคอมไพล์คือคุณต้องเข้าใจว่ามันกำลังจะทำอะไร สิ่งอื่น ๆ ที่มีคอมไพล์คือแม้แต่คนฉลาดก็มักจะยากที่จะเข้าใจสิ่งที่คอมไพล์จะทำ
แบรดโทมัส

1
คุณควรตรวจสอบว่ามีสิ่งใดซ่อนอยู่หรือไม่ มิฉะนั้นคุณจะปรากฏการเปลี่ยนแปลง stashed git stashจากก่อนหน้านี้
Jörn Reimerdes

15

หากคุณมีแฟ้มใน repo ของคุณที่มันควรจะได้รับการปรับแต่งโดย pullers ที่สุดแล้วเปลี่ยนชื่อไฟล์ไปยังสิ่งที่ต้องการconfig.php.templateและเพิ่มที่คุณconfig.php.gitignore


5
ตรวจสอบคำตอบนี้ด้วยคุณสามารถใช้.gitattributesเพื่อให้การเปลี่ยนแปลงของคุณเสมอในขณะที่ผสาน
KurzedMetal

นั่นเป็นสิ่งที่ฉันต้องการมากกว่า เทมเพลตเป็นโซลูชันที่สวยงาม แต่ฉันกลัวว่าฉันจะไม่สามารถใช้สิ่งนี้ได้เนื่องจากฉันเพิ่งเขียนสคริปต์การปรับใช้
Johnny Everson

6

อัปเดต: สิ่งนี้ตอบคำถามที่ถามมาอย่างแท้จริง แต่ฉันคิดว่าคำตอบของ KurzedMetalเป็นสิ่งที่คุณต้องการจริงๆ

สมมติว่า:

  1. คุณอยู่ในสาขา master
  2. สาขาต้นน้ำอยู่masterในorigin
  3. คุณไม่มีการเปลี่ยนแปลงที่ปราศจากข้อผูกมัด

.... คุณสามารถทำได้:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

คุณสามารถสร้างชื่อแทนได้หากคุณต้องการทำบ่อย ๆ โปรดทราบว่าถ้าคุณมีการเปลี่ยนแปลงข้อผูกมัดในการconfig/config.phpนี้จะโยนพวกเขาออก



1

ในการตอบคำถาม: หากคุณต้องการยกเว้นไฟล์บางไฟล์ของการชำระเงินคุณสามารถใช้การชำระเงินแบบเบาบาง

1) ใน.git/info/sparse-checkoutกำหนดสิ่งที่คุณต้องการเก็บ ที่นี่เราต้องการทั้งหมด (*) แต่ (สังเกตเครื่องหมายอัศเจรีย์) config.php:

 /*
 !/config.php

2) บอกคอมไพล์ที่คุณต้องการใช้การชำระเงินเบาบางลงในบัญชี

 git config core.sparseCheckout true

3) หากคุณมีไฟล์นี้อยู่ในเครื่องแล้วให้ทำสิ่งที่คอมไพล์ทำกับเช็คเอาต์แบบเบาบาง (บอกว่าไฟล์จะต้องแยกไฟล์นี้ด้วยการตั้งค่าสถานะ "skip-worktree")

git update-index --skip-worktree config.php

4) เพลิดเพลินไปกับพื้นที่เก็บข้อมูลที่ไฟล์ config.php ของคุณเป็นของคุณไม่ว่าการเปลี่ยนแปลงใด ๆ


โปรดทราบว่าค่าการกำหนดค่า SHOULDN ไม่ได้อยู่ในการควบคุมแหล่งที่มา:

  • มันเป็นการละเมิดความปลอดภัยที่อาจเกิดขึ้น
  • มันทำให้เกิดปัญหาเช่นนี้สำหรับการปรับใช้

ซึ่งหมายความว่าคุณต้องแยกพวกเขาออก (ใส่ไว้ใน. gitignore ก่อนส่งครั้งแรก) และสร้างไฟล์ที่เหมาะสมในแต่ละอินสแตนซ์ที่คุณชำระเงินแอพของคุณ (โดยการคัดลอกและปรับไฟล์ "เทมเพลต")

โปรดทราบว่าเมื่อไฟล์ถูกควบคุมโดย git แล้ว. gignignore จะไม่มีผลกระทบใด ๆ

ระบุว่าเมื่อไฟล์อยู่ภายใต้การควบคุมแหล่งคุณมีเพียงสองตัวเลือก (): - รีบูตประวัติทั้งหมดของคุณเพื่อลบไฟล์ (ด้วยgit filter-branch) - สร้างความมุ่งมั่นที่จะลบไฟล์ มันก็เหมือนกับการต่อสู้กับการต่อสู้ที่สูญเสียไป แต่บางครั้งคุณต้องอยู่กับมัน


0

ในกรณีของพวกเขาคือการเปลี่ยนแปลงในท้องถิ่นปราศจากข้อผูกมัดและหลีกเลี่ยงการรวมความขัดแย้งในขณะที่ดึง

git stash save
git pull
git stash pop

ดู - https://happygitwithr.com/pull-tricky.html

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