จะหยุดการติดตามและเพิกเฉยต่อการเปลี่ยนแปลงไฟล์ใน Git ได้อย่างไร?


1731

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

ฉันเพิ่มลง*.csprojใน LOCAL ของฉัน.gitignoreแล้ว แต่ไฟล์มีอยู่ใน repo แล้ว

เมื่อฉันพิมพ์สถานะ git จะแสดงการเปลี่ยนแปลงของฉันcsprojที่ฉันไม่สนใจติดตามหรือส่งแพทช์

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

มีวิธีที่ถูกต้อง / เป็นบัญญัติในการจัดการสถานการณ์นี้หรือไม่?


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

7
พวกเขาอาจใช้ IDE อื่นหรือไม่
Jarrett

3
อย่างแดกดันฉันมาที่กระทู้นี้เพราะฉันต้องการลบไฟล์. suo จาก repo แต่เก็บไว้ในเครื่อง สำหรับลูกหลานการพัฒนา. Net กำหนดให้คุณเก็บไฟล์. csproj ไว้ใน repo และควรติดตามการเปลี่ยนแปลงเหล่านั้นเสมอเว้นแต่คุณจะรู้สึกโกรธแค้นของนักพัฒนาคนอื่น ๆ ในโครงการของคุณ ถ้าไม่แน่ใจลองดูที่ไฟล์ gitignore repo บน GitHub: github.com/github/gitignore/blob/master/VisualStudio.gitignore
ลองดา

1
@Cupcake คำถามที่คุณเชื่อมโยงไปนั้นถูกเขียนขึ้น 15 วันหลังจากนี้? บางทีคุณอาจมีคนอื่นในใจ?
stephenmurdoch

คำถามที่ยอมรับ @marflar ไม่จำเป็นต้องเป็นที่เก่าแก่ที่สุดคนเพียงที่ดีที่สุดคน คำตอบที่ฉันเชื่อมโยงมี 20 คำตอบขณะที่ข้อนี้มีเพียง 5 ข้อ

คำตอบ:


2129

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

โปรดทราบว่าวิธีการนี้จะลบไฟล์ออกจากที่เก็บดังนั้นนักพัฒนาทั้งหมดจะต้องเก็บสำเนาของไฟล์ในเครื่อง

เพื่อป้องกันไม่ให้ git ตรวจพบการเปลี่ยนแปลงในไฟล์เหล่านี้คุณควรใช้คำสั่งนี้:

git update-index --assume-unchanged [path]

สิ่งที่คุณอาจต้องการทำ: (จาก@Ryan Taylorด้านล่างคำตอบ )

  1. นี่คือการบอกคอมไพล์คุณต้องการไฟล์หรือโฟลเดอร์เวอร์ชันอิสระของคุณเอง ตัวอย่างเช่นคุณไม่ต้องการเขียนทับ (หรือลบ) ไฟล์กำหนดค่าการผลิต / การแสดงละคร

git update-index --skip-worktree <path-name>

คำตอบแบบเต็มอยู่ที่นี่ใน URL นี้: http://source.kohlerville.com/2009/02/untrack-files-in-git/


187
"git rm --cached <file>" จะลบ <file> ออกจากการควบคุมเวอร์ชันในขณะที่เก็บไว้ในที่เก็บข้อมูลที่ใช้งานได้ ไม่ว่าจะเป็นสิ่งที่คุณต้องการ ...
ยาคุบบNarębski

51
แต่เมื่ออื่น ๆ จะดึงที่เก็บไฟล์ * .csproj ของตัวเองจะถูกลบออกหรือไม่ เพราะถ้าเราต้องการไฟล์ที่จะไม่ถูกติดตาม แต่ไม่ถูกลบ
FMaz008

23
หากคุณพยายามที่จะลบไฟล์ทั้งหมดในไดเรกทอรีรวมกับ git ls-files: git ls-files | xargs git rm --cached- ที่จะลบทุกอย่างจากดัชนี git ในไดเรกทอรีที่กำหนดโดยไม่ต้องลบไฟล์จริง
Marco

129
git rm --cached -r <dir>ทำงานซ้ำในโฟลเดอร์และไฟล์ทั้งหมดในนั้น
Chris K

41
วิธีนี้จะหยุดการติดตามไฟล์เก็บไว้ในเครื่อง แต่ทำให้ไฟล์นั้นถูกลบสำหรับผู้ที่ดึง
Edward Newell

249

หากคุณทำเช่นgit update-index --assume-unchanged file.csprojนั้น git จะไม่ตรวจสอบการเปลี่ยนแปลง file.csproj โดยอัตโนมัติ: ซึ่งจะหยุดพวกเขาในสถานะ git ทุกครั้งที่คุณทำการเปลี่ยนแปลง ดังนั้นคุณสามารถทำเครื่องหมายไฟล์. csproj ทั้งหมดของคุณด้วยวิธีนี้แม้ว่าคุณจะต้องทำเครื่องหมายด้วยตนเองว่าจะมีไฟล์ใหม่ที่ repo upstream ส่งให้คุณด้วยตนเอง (หากคุณมีพวกเขาใน.gitignoreหรือของคุณ.git/info/excludeแล้วสิ่งที่คุณสร้างจะถูกละเว้น)

ฉันไม่แน่ใจทั้งหมดว่าไฟล์. csproj คืออะไร ... ถ้าพวกมันอยู่ในแนวของการตั้งค่า IDE (คล้ายกับไฟล์. eclipse และ. class ของ Eclipse) ผมขอแนะนำให้พวกเขาไม่ควรควบคุมแหล่งที่มา ทั้งหมด ในทางกลับกันหากพวกเขาเป็นส่วนหนึ่งของระบบการสร้าง (เช่น Makefiles) ก็ชัดเจนว่าพวกเขาควร --- และวิธีรับการเปลี่ยนแปลงในท้องถิ่นที่เป็นตัวเลือก (เช่นจาก local.csproj a la config.mk) จะมีประโยชน์ : แบ่งการพัฒนาออกเป็นส่วนต่าง ๆ ทั่วโลกและการแทนที่ท้องถิ่น


8
csproj เป็นไฟล์โครงการ C # ซึ่งติดตามว่ามีไฟล์ใดบ้างที่รวมอยู่ในโครงการของคุณและการกำหนดค่าบางอย่างอื่น ๆ มันจะต้องมีการควบคุมแหล่งที่มาสำหรับโครงการที่จะทำงาน
SparK

4
นี่เป็นคำตอบเดียวที่ถูกต้องที่นี่! ฉันใช้คำตอบ @araqnids มาหลายปีแล้วและทำงานได้อย่างถูกต้องตามที่ขอเพื่อแก้ไขปัญหานี้
NHDaly

ความหมายของคำนำหน้า 'ไฟล์' ในอาร์กิวเมนต์ของคำสั่งคืออะไร ทำไมไม่เป็นเช่นนั้น.csproj?
GreenAsJade

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

4
@GreenAsJade: git ls-files -vจะแสดงไฟล์ที่สันนิษฐานว่าไม่มีการเปลี่ยนแปลงด้วยตัวบ่งชี้ตัวพิมพ์เล็ก (เช่นhแทนที่จะเป็นปกติHสำหรับไฟล์แคช)
Amadan

238

มี 3 ตัวเลือกคุณอาจต้องการ # 3

1.สิ่งนี้จะเก็บไฟล์ในตัวเครื่องไว้สำหรับคุณ แต่จะลบให้คนอื่นเมื่อดึงออก

git rm --cached <file-name> หรือ git rm -r --cached <folder-name>

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

git update-index --assume-unchanged <path-name>

3.เพื่อบอก git ว่าคุณต้องการไฟล์หรือโฟลเดอร์เวอร์ชันอิสระของคุณเอง ตัวอย่างเช่นคุณไม่ต้องการเขียนทับ (หรือลบ) ไฟล์กำหนดค่าการผลิต / การแสดงละคร

git update-index --skip-worktree <path-name>

สิ่งสำคัญคือต้องรู้ว่าgit update-index จะไม่เผยแพร่ด้วย git และผู้ใช้แต่ละคนจะต้องทำงานอย่างอิสระ


8
คำตอบนี้สมบูรณ์ที่สุด - นำเสนอวิธีแก้ไขปัญหาต่าง ๆ กับ ramifications ของแต่ละ กรณีเฉพาะที่ฉันทำงานด้วยมีรหัสผ่านฝังอยู่ในไฟล์ปรับแต่ง ฉันต้องการเผยแพร่ไฟล์เทมเพลตแล้วเพิ่มรหัสผ่านลงในสำเนาของฉัน คัดลอกด้วยรหัสผ่านควรละเว้นและไม่เขียนทับ
bmacnaughton

1
ฉันจะตรวจสอบว่าไฟล์ใดที่ใช้สำหรับ 'สันนิษฐานว่าไม่มีการเปลี่ยนแปลง' หรือ 'skip-worktree'
Supawat Pusavanno

3
@SupawatPusavanno เพื่อดูว่าไฟล์ใดที่คุณเลือกไว้ก่อนหน้านี้สำหรับการสันนิษฐานว่าไม่มีการเปลี่ยนแปลงหรือข้ามไปดูคำตอบนี้stackoverflow.com/questions/42363881/… - มันใช้grepและgit ls-files
Ryan Taylor

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

@RyanTaylor: ฉันได้ลองสมมติว่าไม่มีการเปลี่ยนแปลงก่อน (ไม่ทำงาน) และข้ามคำสั่ง worktree (ไม่ทำงาน) เมื่อฉันตรวจสอบสถานะ git ไฟล์จะไม่แสดงว่าคำสั่งทำงาน แต่เมื่อฉันดึงรหัสอีกครั้งจากแหล่งกำเนิด repo คอมไพล์it gives me error that your local changes would be overwrittenใน 2 ไฟล์เหล่านั้นด้วยดังนั้นนั่นหมายความว่ามันไม่ได้ทำการยกเลิกการติดตามใช่ไหม?
NeverGiveUp161

152

นี่เป็นกระบวนการสองขั้นตอน:

  1. ลบการติดตามไฟล์ / โฟลเดอร์ - แต่เก็บไว้ในดิสก์ - ใช้

    git rm --cached 
    

    ตอนนี้พวกเขาไม่แสดงเป็น "เปลี่ยน" แต่ยังแสดงเป็น

        untracked files in  git status -u  
    
  2. เพิ่มไปยัง .gitignore


56
ไม่มีนี้จะลบไฟล์จากการติดตามการรักษามันไว้ในพื้นที่แต่ทำให้มันถูกลบสำหรับทุกคนที่ดึง
Edward Newell

1
ในกรณีของฉันฉันบังเอิญเพิ่มโฟลเดอร์ที่ฉันไม่ต้องการติดตามดังนั้นนี่คือสิ่งที่ฉันต้องการ
Sonny

4
ใช่มันเป็นคำตอบที่ผิดสำหรับคำถามที่ถาม - แต่อาจเป็นคำตอบที่ถูกต้องสำหรับคนส่วนใหญ่ที่พบคำถามนี้ในผลการค้นหา (เช่นฉัน)
Andrew Spencer

95

คำตอบที่ยอมรับยังไม่ได้ผลสำหรับฉัน

ฉันใช้

git rm -r - เก็บไว้แล้ว

คอมไพล์เพิ่ม

คอมไพล์กระทำ - m "แก้ไข. gitignore"

พบคำตอบจากที่นี่


ลิงค์นั้นมีประโยชน์มากโดยเฉพาะการลบไฟล์ทั้งหมดใน. gitignore
ซ้ำ ๆ

9
ฉันกลับมาที่นี่ 3 ครั้งหวังว่าฉันจะสามารถจดจำความทรงจำก่อนหน้าในครั้งต่อไป!
Harry Bosh

ความคิดเห็นของ @Edward Newell ในคำตอบข้างต้นมีผลกับที่นี่เช่นกัน: "นี่จะเป็นการลบไฟล์ออกจากการติดตามเก็บไว้ในเครื่องแต่ทำให้ไฟล์นั้นถูกลบสำหรับทุกคนที่ดึง "
ToJo

46

ลืม. gitignore ของคุณ?

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

git rm --cached -r .

ตรวจสอบให้แน่ใจว่าคุณเป็นรากฐานของโครงการ

จากนั้นคุณสามารถทำตามปกติ

เพิ่ม

git add .

ผูกมัด

git commit -m 'removed all and added with git ignore'

ดัน

git push origin master

ข้อสรุป

หวังว่าสิ่งนี้จะช่วยให้คนที่ต้องทำการเปลี่ยนแปลง.gitignoreหรือลืมมันไปด้วยกัน

  • มันจะลบแคชทั้งหมด
  • ดู. gitignore ของคุณ
  • เพิ่มไฟล์ที่คุณต้องการติดตาม
  • ผลักดันไปยัง repo ของคุณ

4
เมื่อคุณพูดถึงการนำออกหรือเพิ่มคุณจะลืมพูดเมื่อใดและที่ไหน นำออกจากรายการแทร็กหรือไม่ จากที่เก็บ? จากพื้นที่โครงการท้องถิ่น? ลบที่ดึง? ที่กระทำ? ที่ผลักดัน? อนิจจาผู้เขียนทั้งหมดที่นี่มีปัญหาเดียวกัน
นักเลง

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

ความคิดเห็นของ @Edward Newell ในคำตอบข้างต้นมีผลกับที่นี่เช่นกัน: "นี่จะเป็นการลบไฟล์ออกจากการติดตามเก็บไว้ในเครื่องแต่ทำให้ไฟล์นั้นถูกลบสำหรับทุกคนที่ดึง "
ToJo

26

ตามที่ระบุในคำตอบอื่น ๆ คำตอบที่เลือกนั้นผิด

คำตอบสำหรับคำถามอื่นแสดงให้เห็นว่ามันอาจจะข้าม worktree ที่จะต้อง

git update-index --skip-worktree <file>

2
ไม่มีไม่ได้จริงๆ: --skip-worktreeจะใช้ในการเก็บไฟล์บนพื้นที่เก็บข้อมูล แต่หยุดการติดตามการเปลี่ยนแปลงของ ตามที่คำตอบของคุณพูดว่า: --skip-worktree มีประโยชน์เมื่อคุณสั่งให้คอมไพล์ไม่ต้องแตะไฟล์ใดไฟล์หนึ่งเพราะนักพัฒนาควรเปลี่ยนมัน
Erdal G.

4
@ErdalG เผง ตามคำถามพวกเขาต้องการละเว้นการเปลี่ยนแปลงใด ๆ ในไฟล์ แต่เก็บไฟล์ไว้ใน repo
the_new_mr

เห็นด้วยกับ @the_new_mr --assume-unchangedและ--skip-worktreeมีผลที่คล้ายกัน แต่วัตถุประสงค์ของพวกเขาจะแตกต่างกันอย่างสิ้นเชิง ไฟล์เก่านั้นใช้สำหรับการเร่งประสิทธิภาพการทำงานของ git โดยการหลอก git ไม่ให้ตรวจสอบไฟล์ใดไฟล์หนึ่งในขณะที่ไฟล์หลังนั้นใช้สำหรับละเว้นการเปลี่ยนแปลงในอนาคตของไฟล์บางไฟล์ซึ่งเหมาะสำหรับการใช้งานจริง แต่เป็นไฟล์สำคัญ
วิกเตอร์หว่อง

22

เพื่อประหยัดเวลากฎที่คุณเพิ่มลงใน. gitignore ของคุณสามารถใช้สำหรับการลบหลายไฟล์ / โฟลเดอร์เช่น

git rm --cached app/**/*.xml

หรือ

git rm --cached -r app/widgets/yourfolder/

ฯลฯ


นี่เป็นทางออกที่ดีมากในทุกโอกาสที่คุณต้องการแก้ไขขั้นตอน gitignore ทีละขั้นตอน
cutiko

15

เพื่อป้องกันการตรวจสอบไฟล์โดย git

git update-index --assume-unchanged [file-path]

และนำกลับไปใช้ซ้ำ

git update-index --no-assume-unchanged [file-path]

repo สำหรับอ้างอิงกรณีการใช้งานที่คล้ายกันhttps://github.com/awslabs/git-secrets


1
เคล็ดลับการย้อนกลับเป็นเครื่องมือช่วยชีวิตขอบคุณ!
แฮมแมนซามูเอล

9

git update-index --assume-unchangedผู้คนจำนวนมากแนะนำให้คุณใช้ อันที่จริงนี่อาจเป็นทางออกที่ดี แต่ในระยะสั้นเท่านั้น

git update-index --skip-worktreeสิ่งที่คุณอาจต้องการที่จะทำคือ:

(ตัวเลือกที่สามซึ่งคุณอาจไม่ต้องการคือ: git rm --cachedมันจะเก็บไฟล์ในเครื่องของคุณ แต่จะถูกทำเครื่องหมายว่าถูกลบออกจากพื้นที่เก็บข้อมูลระยะไกล)

ความแตกต่างระหว่างสองตัวเลือกแรก?

  • assume-unchangedเป็นการชั่วคราวอนุญาตให้คุณซ่อนการแก้ไขจากไฟล์ หากคุณต้องการซ่อนการแก้ไขที่ทำกับไฟล์แก้ไขไฟล์จากนั้นเช็คเอาต์สาขาอื่นคุณจะต้องใช้no-assume-unchangedการแก้ไขที่เก็บถาวร
  • skip-worktree จะติดตามคุณตามสาขาที่คุณชำระเงินพร้อมการแก้ไขของคุณ!

ใช้กรณีของ assume-unchanged

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

ฉันชอบที่จะใช้เมื่อฉันเพียงต้องการหยุดการติดตามการเปลี่ยนแปลงในขณะที่ + กระทำกลุ่มของไฟล์ ( git commit -a) ที่เกี่ยวข้องกับการดัดแปลงเดียวกัน

ใช้กรณีของ skip-worktree

คุณมีคลาสการตั้งค่าที่มีพารามิเตอร์ (เช่นรวมถึงรหัสผ่าน) ที่เพื่อนของคุณต้องเปลี่ยนตามการตั้งค่าของพวกเขา

  • 1: สร้างเวอร์ชันแรกของคลาสนี้กรอกข้อมูลในฟิลด์ที่คุณสามารถเติมและปล่อยให้ผู้อื่นว่าง / ไม่มีค่า
  • 2: กระทำและผลักดันมันไปยังเซิร์ฟเวอร์ระยะไกล
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: อัปเดตคลาสการกำหนดค่าของคุณด้วยพารามิเตอร์ของคุณเอง
  • 5: ย้อนกลับไปทำงานกับฟังก์ชั่นอื่น ๆ

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

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


7

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

git update-index --skip-worktree path/to/file

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

git update-index --no-skip-worktree path/to/file

1

คำตอบหนึ่งบรรทัด git update-index --assume-unchanged [path]

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

ที่ดีที่สุดตัวอย่าง: ไฟล์ config สำหรับการเชื่อมต่อฐานข้อมูล ใน repo ส่วนกลางคุณจะมีชื่อผู้ใช้รหัสผ่านโฮสต์พอร์ตที่มีค่าของเซิร์ฟเวอร์ฐานข้อมูลการผลิต แต่ใน dev ท้องถิ่นคุณควรใช้เซิร์ฟเวอร์ฐานข้อมูลท้องถิ่นหรือเซิร์ฟเวอร์การพัฒนาอื่น ๆ เท่านั้น (ที่ทีมของคุณตั้งค่าไว้) ในกรณีนี้คุณต้องการเปลี่ยนแปลงไฟล์กำหนดค่า แต่ไม่ควรทำกับ repo ส่วนกลาง

ดีที่สุด


0

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

คุณสามารถใช้คำสั่งนี้:

git rm -r -f /<floder-name>\*

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

ตรวจสอบให้แน่ใจว่าคุณมี. gitignore ของคุณพร้อมสำหรับการคอมมิต
เอกสารประกอบ: git rm


0

ปัญหาอาจเกิดจากคำสั่งของการดำเนินการ หากคุณแก้ไข. gitignore ก่อนจากนั้น git rm --cached xxx คุณอาจต้องประสบกับปัญหานี้ต่อไป

คำตอบที่ถูกต้อง:

  1. git rm --cached xxx
  2. แก้ไข. gignignore

สั่งซื้อไม่เปลี่ยนแปลง!

. gitignore โหลดซ้ำหลังจากการดัดแปลง!


0

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

git update-index - ถือว่าไม่มีการเปลี่ยนแปลง

ตัวอย่าง - git update-index --assume-unchanged .gitignore .idea / compiler.xml


0

เพื่อเพิกเฉยต่อการเปลี่ยนแปลงใด ๆ ของไฟล์ทั้งหมด (บางประเภท) ในไดเรกทอรีฉันต้องรวมวิธีการเหล่านี้เข้าด้วยกันมิฉะนั้นไฟล์จะถูกสร้างขึ้นหากไม่มีอยู่ก่อนหน้านี้

ในด้านล่าง "exclusedir" เป็นชื่อของไดเรกทอรีที่ฉันไม่ต้องการดูการเปลี่ยนแปลง

ก่อนอื่นให้ลบไฟล์ใหม่ที่มีอยู่ออกจากแคชติดตามการเปลี่ยนแปลงของคุณ (โดยไม่ลบออกจากระบบไฟล์ของคุณ)

git status | grep "new file:" | cut  --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache

modified:คุณสามารถทำเช่นเดียวกันกับ renamed:ซับซ้อนกว่านี้เล็กน้อยเนื่องจากคุณจะต้องดูที่โพสต์->บิตสำหรับชื่อไฟล์ใหม่และทำ->บิตก่อนตามที่อธิบายไว้deleted:ด้านล่าง

deleted: ไฟล์มีความซับซ้อนมากขึ้นเนื่องจากคุณไม่สามารถอัปเดตดัชนีสำหรับไฟล์ที่ไม่มีอยู่ในระบบโลคัล

echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d '\n' touch
cat .deletedfiles | xargs -d '\n' git add -f
cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '\n' rm

คำสั่งสุดท้ายในรายการด้านบนจะลบไฟล์ออกจากระบบไฟล์ของคุณอีกครั้งดังนั้นคุณสามารถละเว้นได้

จากนั้นบล็อกการติดตามการเปลี่ยนแปลงจากไดเรกทอรีนั้น

git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/

0

คำสั่งที่ปราศจากคำสั่ง gitเกือบจะได้รับในคำตอบนี้:

วิธีเพิกเฉยไฟล์บางไฟล์สำหรับrepo ในเครื่อง :

  1. สร้างไฟล์~/.gitignore_globalเช่นโดยtouch ~/.gitignore_globalใน terminal ของคุณ
  2. เรียกใช้git config --global core.excludesfile ~/.gitignore_globalครั้งเดียว
  3. เขียนไฟล์ / เส้นทาง dir ~/.gitignore_globalคุณต้องการที่จะไม่สนใจเข้าไป เช่นซึ่งจะถือว่าอยู่ในไดเรกทอรีการทำงานของคุณคือmodules/*.H$WORK_DIR/modules/*.H

ที่จะไม่สนใจไฟล์บางอย่างสำหรับrepo ท้องถิ่นเดียว :

  1. ทำข้างต้นขั้นตอนที่สามสำหรับแฟ้ม.git/info/excludeภายใน repo นั่นคือเขียนไฟล์ / เส้นทาง dir .git/info/excludeคุณต้องการที่จะไม่สนใจเข้าไป เช่นซึ่งจะถือว่าอยู่ในไดเรกทอรีการทำงานของคุณคือmodules/*.C$WORK_DIR/modules/*.C

0

ใช้. gignignore กับปัจจุบัน / อนาคต

วิธีนี้ใช้พฤติกรรม. gitignore มาตรฐานและไม่จำเป็นต้องระบุไฟล์ที่ต้องละเว้นด้วยตนเอง

ไม่สามารถใช้--exclude-from=.gitignoreอีกต่อไป: / - นี่คือวิธีการอัพเดท:

คำแนะนำทั่วไป: เริ่มต้นด้วย repo ที่สะอาด - ทุกสิ่งที่ได้ทำไม่มีสิ่งใดที่ค้างอยู่ในไดเรกทอรีการทำงานหรือดัชนีและทำการสำรองข้อมูล !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

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


-1

หลังจากค้นหามานานหาวิธีทำ นามแฝงคำสั่ง git ใน. .gitconfiglike ใน Android studio project, ก่อนเช็คเอาต์สาขาจะเปลี่ยนไฟล์ config แล้วข้ามมัน, หลังจากสาขาเช็คเอาต์ใช้sedไฟล์เปลี่ยนเปลี่ยน config เป็น config ในเครื่องของฉัน checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :

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