ฉันสามารถ 'คอมไพล์ยอมรับ' ไฟล์และละเว้นการเปลี่ยนแปลงเนื้อหาได้หรือไม่?


355

นักพัฒนาทุกคนในทีมของฉันมีการกำหนดค่าท้องถิ่นของตัวเอง ข้อมูลการกำหนดค่านั้นจะถูกเก็บไว้ในไฟล์ชื่อdevtargets.rbที่ใช้ในงานสร้างเรคของเรา ฉันไม่ต้องการให้ผู้พัฒนาปิดบังไฟล์ devtargets ของกันและกัน

ความคิดแรกของฉันคือการวางไฟล์นั้นไว้ใน.gitignoreรายการเพื่อไม่ให้คอมไพล์

จากนั้นฉันก็เริ่มสงสัยว่า: เป็นไปได้หรือไม่ที่จะส่งไฟล์ แต่ไม่สนใจการเปลี่ยนแปลงไฟล์? ดังนั้นฉันจะยอมรับเวอร์ชันเริ่มต้นของไฟล์และเมื่อนักพัฒนาเปลี่ยนมันในเครื่องของพวกเขา git จะเพิกเฉยต่อการเปลี่ยนแปลงและมันจะไม่ปรากฏในรายการไฟล์ที่ถูกเปลี่ยนแปลงเมื่อคุณทำสถานะ git หรือคอมมิท .

เป็นไปได้ไหม แน่นอนว่ามันจะเป็นคุณสมบัติที่ดี ...


1
ดูstackoverflow.com/questions/3318043/…ในหัวข้อที่คล้ายกัน
VonC

อาจเป็นไปได้ซ้ำกับไฟล์การกำหนดค่าเฉพาะ
Senseful

คำตอบ:


458

แน่นอนว่าฉันทำสิ่งนี้เป็นครั้งคราวโดยใช้

git update-index --assume-unchanged [<file> ...]

หากต้องการยกเลิกและเริ่มการติดตามอีกครั้ง (หากคุณลืมไฟล์ใดที่ไม่ได้ติดตามดูคำถามนี้ ):

git update-index --no-assume-unchanged [<file> ...]

เอกสารที่เกี่ยวข้อง :

- [no-] สันนิษฐานว่าไม่มีการเปลี่ยนแปลง
เมื่อระบุแฟล็กนี้ชื่ออ็อบเจ็กต์ที่บันทึกสำหรับพา ธ จะไม่ถูกอัพเดต ตัวเลือกนี้จะตั้งค่า / ไม่เซ็ตบิต "ถือว่าไม่เปลี่ยนแปลง" สำหรับเส้นทาง เมื่อบิต "ถือว่าไม่มีการเปลี่ยนแปลง" เปิดอยู่ผู้ใช้สัญญาว่าจะไม่เปลี่ยนแปลงไฟล์และอนุญาตให้ Git สมมติว่าไฟล์แผนผังการทำงานตรงกับสิ่งที่บันทึกไว้ในดัชนี หากคุณต้องการเปลี่ยนไฟล์แผนผังการทำงานคุณต้องยกเลิกการตั้งค่าบิตเพื่อบอก Git บางครั้งสิ่งนี้มีประโยชน์เมื่อทำงานกับโปรเจ็กต์ขนาดใหญ่บนระบบไฟล์ที่มีการlstat(2)เรียกระบบช้ามาก(เช่น cifs)

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

ล้มเหลวอย่างสง่างามในกรณีนี้หมายความว่าหากมีการเปลี่ยนแปลงใด ๆ ในอัปสตรีมไปยังไฟล์นั้น (การเปลี่ยนแปลงที่ถูกกฎหมาย ฯลฯ ) เมื่อคุณทำการดึงมันจะพูดว่า:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

และจะปฏิเสธที่จะรวม

เมื่อถึงจุดนี้คุณสามารถเอาชนะสิ่งนี้ได้โดยการคืนค่าการเปลี่ยนแปลงในท้องถิ่นของคุณต่อไปนี้เป็นวิธีหนึ่ง:

 $ git checkout filename.ext

จากนั้นดึงอีกครั้งและแก้ไขไฟล์ในเครื่องของคุณอีกครั้งหรือสามารถตั้งค่า–no-assume-unchangedและคุณสามารถทำการซ่อนและรวมปกติ ฯลฯ ณ จุดนั้น


10
คำสั่งนี้ทำสิ่งที่อยู่ภายในโฟลเดอร์. git หรือไม่ ฉันหมายความว่าถ้าฉันใช้คำสั่งนี้สำหรับไฟล์ config.php สิ่งนี้จะเผยแพร่ไปยังผู้ใช้รายอื่นที่ใช้ repo หรือไม่
Magus

16
@Magus: ไม่ได้นี่จะใช้งานได้กับคุณเท่านั้น
Rob Wilkerson

3
และในไม่ช้าคุณจะต้องการทราบวิธีการพิจารณาว่าไฟล์จะถูกเปลี่ยนแปลงหรือไม่: stackoverflow.com/questions/2363197/ …
Ciro Santilli 郝海东冠状冠状病六四事件法轮功

10
การเปลี่ยนแปลงไฟล์ที่ถูกละเว้นด้วยวิธีนี้จะหายไปเมื่อใช้ "git stash" มีวิธีแก้ไขไหม?
Alexis

5
นี่ไม่ใช่สิ่งที่git update-index --assume-unchangedมีไว้สำหรับ public-inbox.org/git/…
jsageryd

97

วิธีที่ต้องการในการทำเช่นนี้คือการใช้git update-index --skip-worktree <file>ดังที่อธิบายไว้ในคำตอบนี้ :

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

skip-worktreeเป็นมากกว่านั้น: แม้ในกรณีที่ git รู้ว่าไฟล์นั้นถูกแก้ไข (หรือจำเป็นต้องแก้ไขโดยการรีเซ็ต - ฮาร์ดหรือสิ่งที่คล้ายกัน) ก็จะแกล้งทำเป็นไม่ได้ใช้เวอร์ชั่นจากดัชนีแทน สิ่งนี้จะคงอยู่จนกว่าดัชนีจะถูกทิ้ง

หากต้องการยกเลิกการใช้งาน git update-index --no-skip-worktree <file>

ตั้งแต่ git เวอร์ชั่น 2.25.1 นี่ไม่ใช่วิธีที่แนะนำอีกต่อไปแล้วโดยอ้างอิง:

ผู้ใช้มักจะพยายามใช้บิตสันนิษฐานว่าไม่มีการเปลี่ยนแปลงและ skip-worktree เพื่อบอก Git ให้ละเว้นการเปลี่ยนแปลงไฟล์ที่ถูกติดตาม สิ่งนี้ไม่ทำงานตามที่คาดไว้เนื่องจาก Git อาจยังตรวจสอบไฟล์แผนผังการทำงานกับดัชนีเมื่อดำเนินการบางอย่าง โดยทั่วไป Git ไม่ได้ให้วิธีในการละเว้นการเปลี่ยนแปลงในไฟล์ที่ถูกติดตามดังนั้นจึงแนะนำให้ใช้วิธีอื่น

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


สิ่งนี้ใช้ได้กับผู้ใช้ทั้งหมดที่ชำระเงินที่เก็บหรือไม่ พวกเขาจะได้รับไฟล์บางไฟล์ แต่ไม่สามารถเพิ่มการเปลี่ยนแปลงได้อีกต่อไปโดยไม่ได้ตั้งใจเว้นแต่จะพูดอย่างนั้นเหรอ?
mmm

2
@momomo การตั้งค่าสถานะถูกเก็บไว้ในดัชนีดังนั้นไม่ใช่สำหรับผู้ใช้คนเดียวเท่านั้น ดูคำตอบของ erjiangสำหรับสิ่งที่ใช้ได้กับผู้ใช้ทั้งหมด
1615903

ฉันพยายามคิดว่าเนื้อหาของไฟล์ควรเป็นอย่างไร ฉันแสดงความคิดเห็นกับคำตอบที่คุณอ้างถึง แต่ไม่ได้รับคำตอบ มันควรจะอยู่ที่ไหนและเนื้อหามันคืออะไร? คุณรู้หรือไม่
mmm

ฉันไม่ได้ติดตาม คำสั่งถูกใช้เพื่อละเว้นไฟล์หนึ่งไฟล์ที่คุณระบุในคำสั่ง เนื้อหาของไฟล์นั้นไม่เกี่ยวข้อง
1615903

1
เอกสาร Gitเฉพาะกล่าวว่าไม่ใช้git update-index --skip-worktreeเพื่อการนี้
bk2204

43

การปฏิบัติทั่วไปดูเหมือนจะเป็นการสร้างdevtargets.default.rbและการยอมรับแล้วแนะนำให้ผู้ใช้แต่ละคนคัดลอกไฟล์นั้นไปที่devtargets.rb(ซึ่งอยู่ในรายการ. gitignore) ตัวอย่างเช่น CakePHP ทำเช่นเดียวกันกับไฟล์การกำหนดค่าฐานข้อมูลซึ่งจะเปลี่ยนจากเครื่องเป็นเครื่อง


6
คุณไม่สามารถ. gitignore ไฟล์ที่ถูกติดตามได้ . gitignore มีผลกับไฟล์ที่ไม่อยู่ในดัชนีเท่านั้น
CB Bailey

1
ฉันพยายามหลีกเลี่ยงการทำสิ่งนี้แม้ว่าฉันจะไม่มีเหตุผลที่ดีจริงๆ เรากำลังทำอยู่ตอนนี้และฉันคิดว่ามันเป็นความเจ็บปวดที่ต้องจำไว้ว่าฉันต้องสร้างเวอร์ชันของตัวเองโดยไม่ต้อง ".default" ในชื่อ
Derick Bailey

11
@DerickBailey แต่เพื่อความเป็นธรรมมันง่ายกว่าที่จะจำการคัดลอกไฟล์มากกว่าที่จะจำได้โดยใช้--assume-unchangedตัวเลือกสำหรับทุกคนที่โคลนที่เก็บ
Dan

1
@DerickBailey คุณสามารถตั้งค่าการสร้างเรคของคุณเป็นค่าเริ่มต้นได้devtargets.default.rbหากdevtargets.rbไม่มีอยู่
ลุค

@erjang ในไฟล์ devtargets.default.rb นั้นคืออะไร? ตัวอย่าง?
mmm

2

สำหรับผู้ใช้ IntelliJ IDEA: หากคุณต้องการเพิกเฉยต่อการเปลี่ยนแปลงของไฟล์ (หรือไฟล์) คุณสามารถย้ายไฟล์ไปที่อื่นChange Setได้

  • ตรงไปที่Local Changes( Cmd + 9)
  • เลือกไฟล์ที่คุณต้องการเพิกเฉย
  • F6 เพื่อย้ายพวกเขาไปยังอีก Change Set
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.