ฉันจะเพิกเฉยต่อการแก้ไขไฟล์ในอนาคตได้อย่างไร


140

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

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

โดยทั่วไปเราค่อนข้างขี้เกียจและใช้git add .เยอะดังนั้นฉันค่อนข้างแน่ใจว่าถ้าฉันไม่สามารถบอกให้ git ละเว้นไฟล์นี้ได้การเปลี่ยนแปลงในไฟล์จะจบลงด้วยการมุ่งมั่นและผลักดัน

เพื่อสรุป

  1. ฉันต้องการสร้างไฟล์เรียกมันdefault_values.txtว่าถูกเพิ่มลงในที่เก็บ git ของฉันและถูกรวมไว้เมื่อมีคนโคลนที่เก็บนั้น
  2. git add .ไม่ควรเพิ่มdefault_values.txtในการกระทำ
  3. พฤติกรรมนี้ควรถูกส่งต่อไปยังโคลนของที่เก็บ

1
คุณสามารถใช้ git hook เพื่อมี pre-commits hook ที่จะยกเลิกการกระทำได้หรือไม่หากไฟล์ที่แก้ไขเป็น default_values.txt (พูด)
sateesh

1
Git purists จะบอกว่าอย่าขี้เกียจและใช้พื้นที่การแสดงละครอย่างถูกต้องนั่นคือสิ่งที่มีไว้เพื่อ
Xint0

Git purists จะบอกว่าใช้ smudge / clean scripts เป็นโซลูชันที่บำรุงรักษาได้มากที่สุด
Adam Dymitruk

1
Xint0: จริง แต่คุณจะป้องกันไม่ให้คนอื่นเช็คอินโดยบังเอิญได้อย่างไร?
Alan

คำตอบ:


116

ดังที่คนอื่น ๆ กล่าวถึงวิธีแก้ปัญหาสมัยใหม่ที่ดีคือ:

git update-index --skip-worktree default_values.txt

ซึ่งจะเพิกเฉยต่อการเปลี่ยนแปลงไฟล์นั้นทั้งในเครื่องและอัปสตรีมจนกว่าคุณจะตัดสินใจอนุญาตอีกครั้งด้วย:

git update-index --no-skip-worktree default_values.txt

คุณจะได้รับรายชื่อไฟล์ที่ถูกทำเครื่องหมายว่าข้ามด้วย:

git ls-files -v . | grep ^S

โปรดทราบว่าแตกต่างจาก--skip-worktreeที่--assume-unchangedสถานะจะได้รับหายไปหนึ่งครั้งการเปลี่ยนแปลงต้นน้ำถูกดึง


2
หากมีผู้อื่นดึง repo และแก้ไขไฟล์การเปลี่ยนแปลงในไดเร็กทอรีจะถูกละเว้นหรือไม่ ฉันหวังว่าพวกเขาจะต้องพิมพ์--no-skip-worktreeเพื่อเพิ่มการเปลี่ยนแปลง
neaumusic

3
สิ่งที่ทำกับการเปลี่ยนแปลงจะถูกควบคุมโดยพวกเขา กล่าวอีกนัยหนึ่งก็คือพวกเขาจะต้องตั้งค่า skip-worktree บนไฟล์ใน repo หากไม่ต้องการให้มีการผลักดันการเปลี่ยนแปลง หากเป็นไฟล์ที่ตั้งใจจะส่งไปให้ทุกคนแล้วละเว้นการเปลี่ยนแปลงที่ตามมาทั้งหมดทุกคนจะต้องปฏิบัติตามคำแนะนำเดียวกันนี้
moodboom

3
โปรดทราบว่าคุณอาจต้องยกเลิก--skip-worktreeสถานะของไฟล์ก่อนจึงจะสามารถเปลี่ยนสาขาได้หากไฟล์เดียวกันนั้นถูกติดตามในสาขาอื่น
moodboom

3
อืมมันใช้งานได้ ... หลังจากที่ฉันทำการเปลี่ยนแปลงบางอย่างในไฟล์มันก็ไม่ปรากฏขึ้นgit statusแต่เมื่อฉันพยายามชำระเงินไปยังสาขาอื่นฉันได้รับerror: Your local changes to the following files would be overwritten by checkout: แม้ -f ก็ไม่ช่วยerror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
ykravv

1
ฉันได้เหล่านี้นามแฝงและgit ignore git unignore
Michael

48

git update-index --assume-unchanged default_values.txtสิ่งที่คุณกำลังมองหาคือ

ดูเอกสารสำหรับรายละเอียดเพิ่มเติม: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html


11
ไม่ได้ผล แม้ว่ามันจะเพิ่มคอมไพล์ ละเว้นไฟล์ในสาขาภายในเครื่องโคลนของไฟล์เก็บถาวรไม่มีลักษณะการทำงานนี้ (ถ้าคุณเปลี่ยน default_values.txt ในไฟล์เก็บถาวรที่โคลนไฟล์จะถูกเพิ่มลงในคอมมิตด้วย "git add")
Marc

6
ใช่เพราะคุณกำลังตั้งค่าสำหรับ repo ในเครื่องเท่านั้น คุณไม่สามารถผลักดันข้อมูลประเภทนี้ได้
tamasd

8
@Indradhanush - วิธีแก้ปัญหานี้ไม่ตรงตามเกณฑ์ 3 - "ควรส่งต่อพฤติกรรมไปยังโคลนของที่เก็บ" - ซึ่งเป็นสาเหตุที่ฉันไม่ยอมรับ ไม่ได้หมายความว่ามันไม่ใช่คำตอบที่ดี
Marc

ฉันไม่เคยสังเกตข้อ 3 เพราะฉันไม่ได้มองหามัน :)
Indradhanush Gupta

3
สำหรับไฟล์กำหนดค่าในเครื่องที่มีการตั้งค่าแอปส่วนตัวคุณน่าจะต้องการใช้skip-worktreeแทนassume-unchangedข้อมูลเพิ่มเติมstackoverflow.com/questions/13630849/…
Aaron Hoffman

22

วิธีการที่ฉันเห็นโดยทั่วไปคือการสร้างไฟล์ที่มีชื่ออื่นเช่น default_values_template.txt และใส่ default_values.txt ใน. gitignore ของคุณ แนะนำให้ผู้ใช้คัดลอก default_values_template.txt ไปยัง default_values.txt ในพื้นที่ทำงานในเครื่องของตนและทำการเปลี่ยนแปลงตามต้องการ


อืม ... บางทีฉันอาจจะเขียน hook เพื่อคัดลอก default_values_template เป็น default_values ​​โดยอัตโนมัติถ้าไม่มี default_values
Marc

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

ฉันคิดว่าวิธีแก้ปัญหาคือการทำสิ่งนี้โดยเฉพาะอย่างยิ่งกับสคริปต์ที่ดำเนินการเมื่อใดก็ตามที่คุณดึงหรือโคลน แนวคิดอย่างหนึ่งก็คือสิ่งใดก็ตามที่มีนามสกุลเฉพาะ (เช่น .basefile) จะถูกคัดลอกไปยังไฟล์ที่มีนามสกุลหลุดจากนั้นชื่อไฟล์จะถูกเพิ่มไปที่. gitignore ในไดเร็กทอรีนั้น ดังนั้นฉันจะสร้างไฟล์ default_values.txt.basefile และยอมรับสิ่งนั้น ฉันไม่มี git หรือ perl chops ที่จะทำสิ่งนี้ แต่ฉันจะถามเพื่อนที่ทำและแจ้งให้คุณทราบว่ามันทำงานอย่างไร
Marc

1
@AdamDymitruk: ใช่สามารถใช้ clean / smudge ได้ในกรณีนี้ แต่ก็ยังไม่ชัดเจนว่าเป็นตัวเลือกที่ดีที่สุด ตัวอย่างเช่นสิ่งนี้จะทำให้ค่อนข้างยากหากผู้คนต้องการเปลี่ยนไฟล์จริง ๆ เนื่องจากความสะอาด / รอยเปื้อนจะเข้ามาขวางทาง จริงๆแล้วฉันชอบวิธีการที่อธิบายไว้ที่นี่
sleske

1
ฉันใช้คำสั่งจาก git เอง (โดยเฉพาะ git hooks) และใช้.sampleคำต่อท้าย ในกรณีของคุณdefault_values.txt.sample
tir38

5

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

เมื่อคุณกระทำคุณจะ "ทำความสะอาด" โดยการแทนที่ข้อมูลเฉพาะของเครื่องด้วยข้อมูลทั่วไปหรือข้อมูลตัวยึด

สคริปต์ Smudge / clean ต้องได้รับการกำหนดในการใช้หลายครั้งในคำสั่งซื้อที่แตกต่างกันจะเทียบเท่ากับการเรียกใช้สคริปต์สุดท้ายในลำดับ

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


สคริปต์ Clean and Smudge เป็นแบบโลคัลหรือเป็นส่วนหนึ่งของ repo หรือไม่?
Alan

ใช่. :) ... นั่นคือคุณสามารถแชร์รอยเปื้อนผ่าน repo ได้ แต่ไม่ใช่ความคิดที่ดีเมื่อมีข้อมูลที่ละเอียดอ่อนเช่นรหัสผ่านการผลิต หากนั่นไม่ใช่ข้อกังวลคอมไพล์ต้องการให้คุณเปิดใช้งานสคริปต์อย่างชัดเจน มิฉะนั้นผู้คนอาจทำสิ่งที่เป็นอันตรายผ่าน github และ repos ที่แชร์อื่น ๆ ไปยังผู้ใช้รายอื่น
Adam Dymitruk

ฉันต้องการอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ โดยทั่วไปฉันต้องการตั้งค่าโปรเจ็กต์ที่มีค่าเริ่มต้นuser.jsonที่ต้องเขียนทับด้วยเครดิตของนักพัฒนาแต่ละราย แต่ฉันไม่ต้องการให้ dev ตรวจสอบเครดิตโดยไม่ได้ตั้งใจ
Alan

ฉันจะใช้ Google เพื่อทำความสะอาดสคริปต์ตัวอย่างที่มีรอยเปื้อน ดูว่าเกิดอะไรขึ้น นอกจากนี้ให้กระโดดขึ้นไปบนห้อง git irc บน freenode คุณจะได้รับความช่วยเหลือทันที
Adam Dymitruk

3

ฉันได้แก้ไขปัญหานี้โดยการกำหนดตัวกรอง "สะอาด" เพื่อแสดงเนื้อหาของไฟล์ในดัชนี

git show :path/to/myfile ควรพิมพ์เนื้อหาของดัชนีสำหรับไฟล์ที่ระบุดังนั้นเราสามารถใช้สิ่งนั้นในสคริปต์เพื่อแทนที่สำเนาที่ใช้งานได้ด้วยสำเนาที่ไม่ถูกแตะต้องในดัชนี:

#! /bin/sh

git show :$1

ตั้งค่านี้เป็นตัวกรอง "clean" สำหรับไฟล์ที่เกี่ยวข้อง (สมมติว่าคุณใส่ไว้ใน "discard_changes"):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

น่าเสียดายที่ฉันไม่สามารถหาวิธีทำให้ไฟล์ทั่วไปนี้สามารถใช้ได้กับหลาย ๆ ไฟล์เนื่องจากไม่มีวิธีใดที่จะบอกได้ว่าไฟล์ใดที่เรากำลังประมวลผลจากภายใน Clean Script แน่นอนว่าไม่มีอะไรที่จะหยุดคุณจากการเพิ่มกฎการกรองที่แตกต่างกันสำหรับแต่ละไฟล์ แต่มันค่อนข้างยุ่งยาก


1

ฉันพบวิธีแก้ปัญหาที่เหมาะกับทีมของฉัน เราแบ่งปัน githooks ของเราผ่านทาง symlinks git reset -- templatefile.txtและหลังจากเพิ่มแฟ้มแม่แบบในการคอมไพล์ฉันเพิ่มก่อนกระทำเบ็ดที่ตรวจสอบว่าแฟ้มแม่แบบได้รับการแก้ไขและถ้าเป็นเช่นฉัน หากเป็นไฟล์เดียวที่เปลี่ยนแปลงฉันจะยกเลิกการคอมมิตด้วย


-1

ฉันขอแนะนำให้ดูโมดูลย่อย หากคุณวางไฟล์เฉพาะของเครื่องไว้ในโมดูลย่อยการเพิ่มคอมไพล์ควรละเว้น


นี่เป็นความคิดที่ดี แต่ฉันก็ต้องใส่ที่เก็บไฟล์เดียวบนเซิร์ฟเวอร์ git ด้วยซึ่งน้อยกว่าที่เหมาะสมเพียงเพราะเราใช้ github และมีที่เก็บจำนวน จำกัด
Marc

@Marc ดู Visual Studio Team Services โครงการส่วนตัวฟรีไม่ จำกัด และที่เก็บ git บอร์ด Kanban รายการงานและการติดตามข้อบกพร่องเชื่อมโยงการเช็คอินกับรายการงานจัดการ sprints หากคุณเข้าร่วมการต่อสู้หรือโครงการประเภทอื่น ๆ นอกจากนี้ยังมีเครื่องมือสร้างที่ยอดเยี่ยมสำหรับการสร้างกับหลาย ๆ แพลตฟอร์มอีกด้วยหลายสิ่งที่ต้องพูดถึงนั้นฟรีทั้งหมด บางคนกากมันเพราะ Microsoft แต่มันกลับเอาชนะสิ่งที่ github นำเสนอในแง่ของเครื่องมือนอกเหนือจากพื้นที่เก็บข้อมูลเพียงอย่างเดียว มีข้อ จำกัด ของสิ่งที่คุณสามารถทำได้ฟรี แต่ฉันแทบจะไม่เกินพวกเขา
Aran Mulholland

@ มาร์คอีกสิ่งหนึ่งที่ฉันพบว่ามีประโยชน์จริงๆคือฉันสามารถตั้งค่าบัญชีได้มากเท่าที่ฉันต้องการดังนั้นหากฉันกำลังเขียนโครงการสำหรับลูกค้าที่ต้องการเป็นเจ้าของการควบคุมแหล่งที่มาฉันสามารถสร้างบัญชีได้ใช้ เพื่อวางแผนออกแบบและดำเนินโครงการและเมื่อฉันดำเนินการเสร็จแล้วฉันสามารถส่งต่อความเป็นเจ้าของบัญชีให้กับลูกค้าได้
Aran Mulholland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.