เก็บไฟล์ไว้ใน repo Git แต่ไม่ติดตามการเปลี่ยนแปลง


305

ฉันมีไฟล์หลายไฟล์ในเว็บไซต์ CodeIgniter ที่ฉันต้องการมีใน repo แต่ไม่ได้ติดตามการเปลี่ยนแปลงใด ๆ

ตัวอย่างเช่นฉันปรับใช้การติดตั้งเฟรมเวิร์กใหม่นี้กับไคลเอนต์ใหม่ฉันต้องการดาวน์โหลดไฟล์ต่อไปนี้ (พวกเขามีค่าเริ่มต้น CHANGEME) และฉันต้องทำการเปลี่ยนแปลงเฉพาะกับไคลเอนต์นี้ (ข้อมูลประจำตัวฐานข้อมูลข้อมูลที่อยู่อีเมล CSS ที่กำหนดเอง)

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

ปัจจุบันถ้าฉันวิ่ง

git clone git@github.com:user123/myRepo.git httpdocs

และจากนั้นแก้ไขไฟล์ด้านบนทั้งหมดดีมาก git pullจนกว่าฉันจะปล่อยโปรแกรมแก้ไขด่วนหรือแพทช์และเรียกใช้ การเปลี่ยนแปลงทั้งหมดของฉันจะถูกเขียนทับ


2



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

คำตอบ:


618

git มีทางออกที่แตกต่างในการทำเช่นนี้ ก่อนอื่นให้เปลี่ยนไฟล์ที่คุณไม่ต้องการติดตามและใช้คำสั่งต่อไปนี้:

git update-index --assume-unchanged FILE_NAME

และหากคุณต้องการติดตามการเปลี่ยนแปลงให้ใช้คำสั่งนี้อีกครั้ง:

git update-index --no-assume-unchanged FILE_NAME

เอกสาร git-update-index


ฉันทำในสิ่งที่คุณพูด แต่สถานะคอมไพล์บอกว่าไฟล์นั้นถูกแก้ไข
rraallvv

7
ใช่นี่ควรเป็น "คำตอบที่ยอมรับ" ทำงานให้ฉัน
joshmcode

34
ตามที่ Junio ​​Hamano (ผู้ดูแล Git): "สมมติว่าไม่เปลี่ยนแปลงไม่ควรถูกทารุณกรรมเพราะกลไกการเพิกเฉย [... ] ไม่ใช่สัญญาโดย Git ที่ Git จะพิจารณาเส้นทางเหล่านี้เป็นแบบไม่เปลี่ยนแปลง --- ถ้า Git สามารถกำหนดเส้นทางที่ถูกทำเครื่องหมายว่าไม่มีการเปลี่ยนแปลงโดยไม่มีค่าใช้จ่ายพิเศษ lstat (2) ค่าใช้จ่ายได้ขอสงวนสิทธิ์ในการรายงานว่าเส้นทางได้รับการแก้ไข (ดังนั้น "git commit -a" มีอิสระที่จะยอมรับ การเปลี่ยนแปลง)." กล่าวอีกนัยหนึ่งคือไม่มีการเปลี่ยนแปลงถือว่าเป็นเพียงปัญหาด้านประสิทธิภาพการทำงานในท้องถิ่นเท่านั้น หาก Git สามารถระบุได้ว่าไฟล์เหล่านั้นเปลี่ยนไปในทางที่เบาลง
Alejandro García Iglesias

41
อ่านข้อมูลของมันผมคิดว่าตัวเลือกที่มีความเหมาะสมดีกว่าที่จะทำงานนี้กว่า--skip-worktree --assume-unchanged
PJSCopeland

26
--skip-worktree ย่อมเป็นตัวเลือกที่ดีกว่า ข้อมูลเพิ่มเติม: stackoverflow.com/questions/13630849/…
กำหนดเอง

80

วิธีดึงคำตอบออกจากความคิดเห็นของคำตอบอื่น:

$ git update-index --skip-worktree FILENAME

ดูเหมือนจะเป็นตัวเลือกที่ดีกว่า --assume-unchanged

สามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ที่นี่: Git - ความแตกต่างระหว่าง 'สมมติ - ไม่เปลี่ยนแปลง' และ 'skip-worktree'


3
ขอบคุณ นอกจากนี้: medium.com/@igloude/git-skip-worktree-and-how-i-used-to-hate-config-files
aexl

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

บทความที่อ้างอิงโดย @aexl ได้ย้ายไปที่compiledsuccessfully.dev/git-skip-worktree
Andrew Keeton

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

58

สำหรับโครงการ Code Igniter ของฉันฉันจะเก็บdatabase.php.exampleและconfig.php.exampleไว้ใน repo

จากนั้นฉันเพิ่มconfig.phpและapplications / config / database.phpไปยังไฟล์. gitignore

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


12
เป็นทางออกที่ดี แต่ฉันคิดว่าคำตอบของนาสิกานต์นั้นดีที่สุด
wordoforthewise

นี่ไม่ใช่ทางออกที่ดี หากคุณล้างดัชนี git ของคุณคุณจะเริ่มติดตามการเปลี่ยนแปลงเมื่อคุณไม่ได้ตั้งใจ ดู @nasirkhans ตอบวิธีการที่ถูกต้องในการทำเช่นนี้
Brian Melton-Grace - MSFT

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

1
ถ้าอยู่ใน gitignore ทำไมมันจะเริ่มติดตามการเปลี่ยนแปลงอีกครั้ง
Shapeshifter

แก้ปัญหา OP แต่ไม่ตอบคำถามจริงๆ
Travis Wilson

1

ฉันจะใส่ไว้ใน.gitignoreไฟล์ของคุณและเพียงแค่คัดลอกด้วยตนเองตามต้องการ

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


1
ไม่มีวิธีในการเพิ่มลงใน repo ก่อนแล้วเพิ่มลงใน. gitignore หรือไม่ มันจะดีถ้ามีวิธีแก้ปัญหาสำหรับเรื่องนี้ในการรวมไฟล์ แต่ไม่มีการเปลี่ยนแปลงใด ๆ หลังจากการกระทำบางอย่างหรือบางสิ่งบางอย่าง
gorelative

1
@mklauber ฉันต้องการที่จะให้พวกเขาไปเรื่อย ๆ git rm <file>จนกว่าฉันจะเรียกใช้ จุดประสงค์คือ IE: ไฟล์ config.php ฉันต้องการเก็บไฟล์ปรับแต่ง แต่เห็นได้ชัดว่าฉันไม่ต้องการติดตามข้อมูลประจำตัวฐานข้อมูลจากไคลเอนต์ไปยังไคลเอนต์เนื่องจากพวกเขาแตกต่างกัน
gorelative

1
ใช่ฉันมีปัญหากับไฟล์ database.yml ของเรา เราเก็บโครงกระดูกแล้วคัดลอกและเปลี่ยน
Michael Durrant

หากฉันสร้างไฟล์กำหนดค่า "Skeleton" เหล่านี้คุณจะเพิ่มลงในการคอมมิชชันเริ่มต้นหรือไม่ แล้วแก้ไข. gitignore เพื่อข้ามไฟล์? มีผลในการรักษาไฟล์ใน repo แต่เป็นโครงกระดูกหรือไม่
gorelative

10
คุณมีสองตัวเลือกเหล่านี้: เพิ่มไฟล์โดยgit add file1แล้วแก้ไข.gitignoreไฟล์ของคุณ ไฟล์ที่ยืนยันจะอยู่ในนั้นและจะไม่มีการอัพเดท หรือ: คุณสามารถเพิ่มไฟล์ไปยัง.gitignoreแล้วเพิ่มด้วยgit add --force file1เพื่อบังคับไฟล์คุณสามารถใช้ตัวเลือกที่ 2 เมื่อใดก็ตามที่คุณต้องเขียนทับไฟล์
klaustopher

1

คำตอบที่ได้รับคือการแก้ปัญหาเพียงบางส่วน แต่แนะนำปัญหาให้มากขึ้น

ฉันต้องการเก็บไฟล์ "Web.Local.config" ทางออกเดียวที่ได้ผลสำหรับฉันคือ:

1. ยกเว้นไฟล์จากโครงการ

2. สร้างสำเนาไฟล์แยกเป็น Web.LocalTemplate.config

ขณะนี้ "Web.LocalTemplate.config" ได้รับการติดตามโดย Git นักพัฒนาทั้งหมดสามารถใช้เป็นจุดเริ่มต้นได้ อย่างไรก็ตาม "Web.Local.config" การไม่เป็นส่วนหนึ่งของโครงการจะถูกละเว้นโดยอัตโนมัติ


จะgit update-index --skip-worktree FILENAMEแก้ปัญหาของคุณเพียงบางส่วนหรือแม้แต่เพิ่มปัญหามากขึ้นได้อย่างไร มันแก้ไขสิ่งที่คุณพยายามทำ คุณลองหรือยัง
Amir Asyraf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.