ใช้. gignignore บนที่เก็บที่มีอยู่แล้วติดตามไฟล์จำนวนมาก


314

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

ปัญหาของฉันคือไฟล์ทั้งหมดเหล่านั้นกำลังถูกติดตามอยู่และเท่าที่ฉันรู้ Git จะไม่เพิกเฉยต่อไฟล์ที่ถูกติดตามแล้วก่อนที่จะมีการเพิ่มกฎลงในไฟล์นี้เพื่อละเว้น

มันแนะนำให้ใช้: git rm --cachedและยกเลิกการติดตามพวกเขาด้วยตนเอง แต่นั่นจะพาฉันไปตลอดกาลเพื่อผ่านพวกเขาทีละคน

ฉันคิดเกี่ยวกับการลบที่เก็บและสร้างใหม่อีกครั้ง แต่คราวนี้มีไฟล์. gitignore อยู่ แต่ต้องมีวิธีที่ดีกว่าในการทำเช่นนี้


1
คุณสามารถเลือกgit rm --cachedไดเรกทอรีทั้งหมดด้วย-rตัวเลือกถ้ามันมีประโยชน์
Nathan Wallace



คำตอบ:


870

คำตอบนี้แก้ปัญหาของฉัน:

ก่อนอื่นยอมรับการเปลี่ยนแปลงที่ค้างอยู่ทั้งหมด

จากนั้นเรียกใช้คำสั่งนี้:

git rm -r --cached .

สิ่งนี้จะลบทุกอย่างออกจากดัชนีจากนั้นเรียกใช้:

git add .

กระทำมัน

git commit -m ".gitignore is now working"

9
คำตอบที่สมบูรณ์แบบ! โปรดเพิ่มเครื่องหมายgit push originเพื่อสะท้อนการเปลี่ยนแปลงในที่เก็บระยะไกล
Sanket Berde

8
ฉันเริ่มใช้คำตอบนี้ ... และมันก็ลบเกือบทุกอย่างในโครงการของฉัน! เห็นได้ชัดว่าฉันกำลังทำอะไรผิด แต่ฉันต้องการเตือนผู้คนไม่ให้ทำตามคำแนะนำนี้โดยไม่ตั้งใจ
Mark Olbert

4
ท้ายนี้จะเสียประวัติไฟล์เมื่อคุณลบและเพิ่มใหม่อีกครั้งหรือไม่
Aran Mulholland

10
ฉันสงสัยว่ามีการ.gitignore is now workingส่งข้อความนี้จำนวนเท่าใด :)
ihavenoidea

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

61
  1. สร้างไฟล์. gitignore เพื่อทำเช่นนั้นคุณเพียงแค่สร้างไฟล์. txt ที่ว่างเปล่า

  2. จากนั้นคุณต้องเปลี่ยนชื่อที่เขียนบรรทัดต่อไปนี้บน cmd (ซึ่งgit.txtเป็นชื่อของไฟล์ที่คุณเพิ่งสร้างขึ้น):

    rename git.txt .gitignore

  3. จากนั้นคุณสามารถเปิดไฟล์และเขียนไฟล์ที่ไม่ได้ติดตามทั้งหมดที่คุณต้องการเพิกเฉยได้ ตัวอย่างเช่นของฉันมีลักษณะเช่นนี้:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

มีชุดของไฟล์. gitignore ที่มีประโยชน์ทั้งหมดโดย GitHub

  1. เมื่อคุณมีสิ่งนี้แล้วคุณจะต้องเพิ่มมันเข้าไปในพื้นที่เก็บข้อมูล git ของคุณเหมือนกับไฟล์อื่น ๆ แต่จะต้องอยู่ในรูทของพื้นที่เก็บข้อมูล

  2. จากนั้นในเทอร์มินัลของคุณคุณต้องเขียนบรรทัดต่อไปนี้:

    git config - global core.excludesfile ~ / .gitignore_global

จากเอกสารทางการ:

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

เปิด Terminal เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ: git config --global core.excludesfile ~ / .gitignore_global

หากพื้นที่เก็บข้อมูลมีอยู่แล้วคุณจะต้องเรียกใช้คำสั่งเหล่านี้:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

หากขั้นตอนที่ 2 ไม่ทำงานคุณควรเขียนรูทรูทของไฟล์ที่คุณต้องการเพิ่ม


4
@Karen_Wiznia "git config ... _global" สร้าง gitingore ทั่วโลกสำหรับ repos Git ทั้งหมดบนคอมพิวเตอร์ OP ไม่ต้องการทำเช่นนั้น
ivan7707

ฉันหวังว่าฉันจะชอบสิ่งนี้มากกว่าหนึ่งครั้งฉันกลับมาที่คำถามนี้อย่างต่อเนื่องเพื่อค้นหาการแจ้งเตือนนี้
Antony D'Andrea

1
ควรเป็น "mv git.txt .gitignore" แทน "เปลี่ยนชื่อ git.txt .gitignore"
Ahmad F

30

ตามที่ระบุไว้ที่นี่คุณสามารถอัปเดตดัชนี:

git update-index --assume-unchanged /path/to/file

โดยทำเช่นนี้ไฟล์จะไม่แสดงขึ้นมาในหรือgit statusgit diff

หากต้องการเริ่มติดตามไฟล์อีกครั้งคุณสามารถเรียกใช้:

git update-index --no-assume-unchanged /path/to/file

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

1
นี่เป็นสิ่งที่ดี แต่ถ้าเราดึง มีข้อขัดแย้งผสานหรือไม่
pramod

@pramod คำถามที่ดี ฉันไม่แน่ใจจริงๆ ลองใช้ในที่เก็บการทดสอบแบบถอดลงหรือไม่
Patrick James McDougle

15

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

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

git ls-tree --name-only --full-tree -r HEAD

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

ดังนั้นแทนที่จะ:

git rm -r --cached .

การกำหนดเป้าหมายไฟล์หรือไดเรกทอรีที่ไม่พึงประสงค์ปลอดภัยยิ่งขึ้น:

git rm -r --cached cache/

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

git add .

และกระทำ ...

git commit -m ".gitignore is now working"

การอ้างอิง: https://amyetheredge.com/code/13.html


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

2

นี่เป็นวิธีหนึ่งในการ "ยกเลิกการติดตาม" ไฟล์ใด ๆ ที่จะถูกละเว้นเป็นอย่างอื่นภายใต้ชุดรูปแบบการยกเว้นปัจจุบัน:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

สิ่งนี้จะทำให้ไฟล์ในไดเรกทอรีทำงานของคุณ แต่ลบออกจากดัชนี

เคล็ดลับที่ใช้ในที่นี้คือการจัดทำไฟล์ดัชนีที่ไม่มีอยู่ให้กับ git ls-files เพื่อให้คิดว่าไม่มีไฟล์ที่ถูกติดตาม รหัสเชลล์ด้านบนจะถามถึงไฟล์ทั้งหมดที่จะถูกละเว้นหากดัชนีนั้นว่างเปล่าแล้วลบออกจากดัชนีจริงด้วย git rm

หลังจากไฟล์นั้น“ ไม่ได้ติดตาม” ให้ใช้สถานะ git เพื่อตรวจสอบว่าไม่มีสิ่งใดที่สำคัญถูกลบออก (ถ้าเป็นเช่นนั้นให้ปรับรูปแบบการแยกของคุณและใช้ git reset - พา ธ เพื่อกู้คืนรายการดัชนีที่ลบออก) จากนั้นทำการคอมมิชชันใหม่ที่ทำให้ "crud" หลุดออกไป

“ crud” จะยังคงอยู่ในความมุ่งมั่นเก่า ๆ คุณสามารถใช้ git filter-branch เพื่อสร้างเวอร์ชันเก่าของคอมมิชชันถ้าคุณต้องการประวัติที่สะอาด (จริงๆแล้วการใช้ git filter-branch จะ "เขียนประวัติใหม่" ดังนั้นจึงไม่ควรดำเนินการเบา ๆ หากคุณมีผู้ทำงานร่วมกันที่ดึง ประวัติการกระทำความผิดใด ๆ ของคุณหลังจากการแนะนำ“ crud” เป็นครั้งแรก)


ดูเหมือนว่าจะเป็นทางออกที่มั่นคง :) ฉันคิดว่านี่เป็นเปลือก Linux ใช่มั้ย น่าเสียดายที่ฉันเป็นผู้ใช้ Win7 วิธีใดที่ฉันสามารถทำได้ใน windows?
Tohid

0

ลบไฟล์ออกจากพื้นที่จัดเตรียม

git reset HEAD .

เพิ่มการเปลี่ยนแปลงทั้งหมด

git add .

กระทำมัน

git commit -m ".gitignore is now working"

-1

ฉันคิดว่านี่เป็นวิธีที่ง่ายสำหรับการเพิ่มไฟล์. gitignoreในที่เก็บที่มีอยู่

วิชาบังคับก่อน :

คุณต้องมีเบราว์เซอร์เพื่อเข้าถึงบัญชี GitHub ของคุณ

ขั้นตอน

  1. สร้างไฟล์ใหม่ในที่ต้องการ (ที่มีอยู่) โครงการของคุณและชื่อ.gitignore คุณจะได้รับการชี้นำความพร้อมในการ .gitignore แม่เร็วที่สุดเท่าที่คุณตั้งชื่อไฟล์เป็น.gitignore ใช้เทมเพลตเหล่านี้หรือใช้gitignore.ioเพื่อสร้างเนื้อหาของไฟล์gitignoreของคุณ
  2. ยอมรับการเปลี่ยนแปลง
  3. ตอนนี้โคลนที่เก็บนี้

มีความสุข!


-3

ใช้รับgit clean
ความช่วยเหลือในการทำงานนี้

git clean -h

หากคุณต้องการที่จะเห็นสิ่งที่จะเกิดขึ้นก่อนให้แน่ใจว่าได้ผ่านสวิตช์ -n สำหรับการทำงานที่แห้ง

git clean -xn

เพื่อลบขยะ gitingnored

git clean -xdf

ระวัง: คุณอาจเพิกเฉยต่อไฟล์ปรับตั้งในเครื่องเช่น database.yml ซึ่งจะถูกลบด้วย ใช้ความเสี่ยงของคุณเอง

แล้วก็

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