git: จะละเว้นไฟล์ที่ไม่ได้ติดตามทั้งหมดในปัจจุบันได้อย่างไร?


131

มีวิธีที่สะดวกในการละเว้นไฟล์และโฟลเดอร์ที่ไม่ได้ติดตามทั้งหมดในที่เก็บ git หรือไม่?
(ฉันรู้เกี่ยวกับ.gitignore.)

ดังนั้นgit statusจะให้ผลลัพธ์ที่สะอาดอีกครั้ง



หรือคุณอาจต้องการเพิ่ม * ไฟล์เดียวในไฟล์. gitignore ของคุณ :)
vilicvane

1
เพียงแค่มี*แนวโน้มที่จะไม่ใช่สิ่งที่คุณต้องการ
sjas


ประหลาดใจกับคำตอบที่ไม่ถูกต้องมากมาย -u noมันผิด. -unoถูกต้อง. -u noพยายามสร้างสถานะบนไฟล์ที่เรียกว่าno! noคือไม่-uอาร์กิวเมนต์ ในการบังคับnoให้ตีความว่าเป็นการโต้แย้ง-uต้องไม่มีช่องว่าง การทดสอบนี้ทำtouch Invalidและเปรียบเทียบการgit status -uInvalid git status -u Invalid
Aaron McDaid

คำตอบ:


252

ตามที่ได้กล่าวไปแล้วหากต้องการแยกออกจากสถานะให้ใช้:

git status -uno  # must be "-uno" , not "-u no"

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

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

การเรียกที่ตามมาทุกครั้งgit statusจะเพิกเฉยต่อไฟล์เหล่านั้นอย่างชัดเจน

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

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

สิ่งนี้จะสร้าง subshell ที่เสร็จสมบูรณ์ก่อนที่.gitignoreไฟล์จะถูกสร้างขึ้น

คำอธิบายคำสั่งเมื่อฉันได้รับคะแนนโหวตเป็นจำนวนมาก (ขอบคุณ!) ฉันคิดว่าฉันควรอธิบายคำสั่งนี้หน่อยดีกว่า:

  • git status --porcelainถูกใช้แทนgit status --shortเนื่องจากสถานะด้วยตนเอง "ให้เอาต์พุตในรูปแบบที่ง่ายต่อการแยกวิเคราะห์สำหรับสคริปต์ซึ่งคล้ายกับเอาต์พุตสั้น ๆ แต่จะคงที่ในเวอร์ชันคอมไพล์และไม่คำนึงถึงการกำหนดค่าของผู้ใช้" ดังนั้นเราจึงมีทั้งการแยกวิเคราะห์และความเสถียร
  • grep '^??'กรองเฉพาะบรรทัดที่ขึ้นต้นด้วย??ซึ่งตามคู่มือสถานะคอมไพล์สอดคล้องกับไฟล์ที่ไม่ได้ติดตาม
  • cut -c4- ลบอักขระ 3 ตัวแรกของทุกบรรทัดซึ่งทำให้เรามีเพียงพา ธ สัมพัทธ์ไปยังไฟล์ที่ไม่ได้ติดตาม
  • |สัญลักษณ์ท่อซึ่งผ่านการส่งออกของคำสั่งก่อนหน้าเพื่อป้อนคำสั่งดังต่อไปนี้;
  • >>และ>สัญลักษณ์ประกอบการเปลี่ยนเส้นทางซึ่งผนวกผลลัพธ์ของคำสั่งก่อนหน้านี้ไปยังแฟ้มหรือเขียนทับ / สร้างไฟล์ใหม่ตามลำดับ

ตัวแปรอื่นสำหรับผู้ที่ต้องการใช้sedแทนgrepและcutนี่เป็นอีกวิธีหนึ่ง:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- ลบอักขระ 4 ตัวแรกของทุกบรรทัดซึ่งทำให้เรามีเพียงพา ธ สัมพัทธ์ไปยังไฟล์ที่ไม่ได้ติดตาม No. -cคือจุดเริ่มต้นของรายการหมายเลขคอลัมน์ที่จะตัด และ 4- เลือกบรรทัดจากคอลัมน์ 4 ไปยังจุดสิ้นสุดซึ่งจะตัดคอลัมน์ 1-3 ดังนั้นคำสั่ง cut ของคุณจะลบอักขระ 3 ตัวแรกของแต่ละบรรทัดออกไป หากคุณลบอักขระ 4 ตัวออกจากบรรทัดสถานะคอมไพล์เช่นตัวอักษรสำหรับไฟล์นี้ที่นี่: ?? app/views/static_pages/contact.html.erbคุณจะลบอักษรตัวแรกของapp. ดังนั้นคำสั่งจึงถูกต้อง แต่คำอธิบายผิดพลาด
7

@ 7stud: ขอบคุณคุณพูดถูกฉันเขียน 4 โดยไม่ได้ตั้งใจ ฉันได้แก้ไขคำตอบแล้ว
Diego

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

1
-u noไม่ได้ผลสำหรับฉัน แต่-unoไม่ ฉันได้อัปเดตคำตอบตามนั้น นี่เป็นการออกแบบที่แปลกสำหรับคอมไพล์ ฉันใช้ git 1.7.1
Aaron McDaid

2
@AaronMcDaid: ขอบคุณ การเปลี่ยนแปลงได้รับการบันทึกไว้ที่นี่และจะกล่าวถึงที่นี่
Diego

51

หากคุณต้องการละเว้นไฟล์เหล่านี้อย่างถาวรวิธีง่ายๆในการเพิ่มไฟล์เหล่านี้.gitignoreคือ:

  1. เปลี่ยนเป็นรากของต้นไม้คอมไพล์
  2. git ls-files --others --exclude-standard >> .gitignore

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


3
ทำไมถึงไม่ได้รับการโหวตมากเท่านี้? ไม่ต้องไปป์ผ่านโปรแกรมอื่น ๆ อีก 2 โปรแกรม!
JoelFan

4
@JoelFan: สองเหตุผล: 1) อันนี้ใช้งานได้จากรูทของคอมไพล์เท่านั้นในขณะที่ไดเร็กทอรีย่อยที่ยอมรับทำงานได้จากทุกไดเร็กทอรีย่อยคุณเพียงแค่ต้องปรับแต่ง.gitignoreเส้นทางปลายทาง2) หากคุณมีไดเร็กทอรีที่ไม่ได้ติดตามอันนี้จะแสดงรายการแต่ละรายการและ ทุกไฟล์ในนั้น แต่ไม่ใช่ไดเร็กทอรีที่ไม่ได้ติดตาม (ดังนั้นคุณจะไม่เพิกเฉยต่อไดเร็กทอรีและยังคงได้รับรายงานไฟล์ในอนาคตในไดเร็กทอรีว่าไม่มีการติดตามในขณะที่ไฟล์ที่ได้รับการยอมรับจะแสดงเฉพาะไดเร็กทอรีเท่านั้นไม่ใช่ไฟล์ที่ไม่ถูกติดตามภายใน นี่เป็นเรื่องของสิ่งที่คุณต้องการทำ แต่บ่อยครั้งที่คุณต้องการเพิกเฉยต่อผบ. ทั้งหมด
Diego

1
ขอบคุณ Poolie ฉันซาบซึ้งในความแตกต่างของข้อเสนอแนะของคุณเนื่องจากจุดที่ @Diego กล่าวถึงฉันเริ่มทำงานกับไลบรารีไฟล์และโฟลเดอร์และฉันไม่ต้องการติดตาม / พุชไฟล์ต้นฉบับ ฉันต้องการติดตามไฟล์ที่ฉันเพิ่มหรือสร้างใหม่ในไลบรารีเท่านั้น การเพิ่มโฟลเดอร์หลักจะไม่สนใจทุกอย่าง นี่ / วิธีแก้ปัญหาของคุณเพิ่มไฟล์ทั้งหมด 1696 ไฟล์ในพริบตา xD
Chaos7703

git config status.showUntrackedFiles noนอกจากนี้ยังสามารถทำได้โดยใช้
larsch

16

พบได้ในคู่มือ

พารามิเตอร์โหมดใช้เพื่อระบุการจัดการไฟล์ที่ไม่ถูกติดตาม เป็นทางเลือก: ค่าเริ่มต้นเป็นทั้งหมดและหากระบุไว้จะต้องติดอยู่กับตัวเลือก (เช่น -uno แต่ไม่ใช่ -u no)

git status -uno


39
ถ้าทุกคนใช้ RTFM ก่อนโพสต์เราจะไม่ได้รับตัวแทนใด ๆ :-)
Jenny D

4

สองทาง:

ใช้อาร์กิวเมนต์ "-uno" เพื่อ git-status นี่คือตัวอย่าง:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

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


2
วิธีที่สะดวกในการแก้ไขสิ่ง.gitignoreมีgit status | cat >> temp && vim tempชีวิต จากนั้นแก้ไขไฟล์เพื่อลบสองสามบรรทัดแรกและบรรทัดสุดท้ายรวมทั้งต่อท้าย#และช่องว่างหลังจากนั้น แล้วcat temp >> .gitignore && rm temp. ในกรณีที่ไม่มี.gitignoreอยู่ก่อนmv temp .gitignoreจะทำ สิ่งที่น่าเกลียด แต่ดีกว่าการอัปเดต.gitignoreด้วยตนเอง
sjas

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

3

-u noไม่แสดงไฟล์ที่ไม่มีการจัดเตรียมเช่นกัน -unoทำงานได้ตามต้องการและแสดงโดยไม่จัดฉาก แต่ซ่อนไม่ถูกติดตาม


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

2

ในกรณีที่คุณไม่ได้ใช้ Unix เช่น OS สิ่งนี้จะทำงานบนWindowsโดยใช้PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

อย่างไรก็ตาม.gitignoreไฟล์ต้องมีบรรทัดว่างใหม่มิฉะนั้นจะต่อท้ายข้อความในบรรทัดสุดท้ายไม่ว่าไฟล์นั้นจะมีเนื้อหาหรือไม่ก็ตาม

นี่อาจเป็นทางเลือกที่ดีกว่า:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

ถ้าคุณมีจำนวนมากของไฟล์ที่ไม่ได้ติดตามและไม่ต้องการที่จะ " gitignore" ทั้งหมดของพวกเขาทราบว่าตั้งแต่Git 1.8.3 (เมษายน 22D 2013) , git statusจะพูดถึง--untracked-files=noแม้ว่าคุณจะไม่ได้เพิ่มตัวเลือกที่อยู่ใน ที่แรก!

" git status" แนะนำให้ผู้ใช้พิจารณาการใช้--untracked=noตัวเลือกเมื่อใช้เวลานานเกินไป


0

ฉันมาที่นี่เพื่อพยายามแก้ปัญหาที่แตกต่างออกไปเล็กน้อย สิ่งนี้อาจเป็นประโยชน์กับคนอื่น:

feature-aฉันจะสร้างสาขาใหม่ เป็นส่วนหนึ่งของสาขานี้ฉันสร้างไดเรกทอรีใหม่และจำเป็นต้องแก้ไข. gitignore เพื่อระงับบางส่วน สิ่งนี้เกิดขึ้นมากเมื่อเพิ่มเครื่องมือใหม่ในโปรเจ็กต์ที่สร้างโฟลเดอร์แคชต่างๆ .serverless, .terraformฯลฯ

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

คำตอบที่นี่นั้นง่ายมากแม้ว่าฉันจะต้องหาบล็อกนี้เพื่อดูว่า:

เพียงชำระเงินไฟล์. gitignore จากfeature-aสาขา

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