Git: รายการเฉพาะไฟล์“ untracked” (เช่นเดียวกับคำสั่งที่กำหนดเอง)


339

มีวิธีใช้คำสั่งที่ต้องการgit ls-filesแสดงเฉพาะไฟล์ที่ไม่ได้ติดตามหรือไม่

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

git ls-files -d | xargs git rm

ฉันต้องการสิ่งที่คล้ายกันสำหรับไฟล์ที่ไม่ได้ติดตาม:

git some-command --some-options | xargs git add

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

git status --porcelain | grep '^??' | cut -c4- | xargs git add

ดูเหมือนว่าจะต้องมีคำสั่งที่ดีกว่าที่ฉันสามารถใช้ได้ที่นี่ และถ้าไม่มีฉันจะสร้างคำสั่ง git ที่กำหนดเองได้อย่างไร


คุณช่วยอธิบายเพิ่มเติมได้ไหมว่าทำไมคุณถึงต้องการgit ls-files -d | xargs git rm?
takeshin

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

หากพวกเขาหายไปพวกเขาจะไม่ถูกลบไปแล้ว? ถ้า ... คุณถูกดึงออกมาจากที่อื่นแล้วคุณพยายามซิงก์กับรีโมต ... ฉันคิดว่าฉันเข้าใจแล้ว
Buttle Butkus

ฉันได้ทดสอบคำตอบทั้งหมดแล้วหากไม่มีโฟลเดอร์ที่ไม่ได้ติดตามไม่มีใครสามารถค้นหาได้
kittygirl

@kittygirl สิ่งนี้ถูกต้อง เนื่องจากgitใช้ได้กับไฟล์เท่านั้นจึงไม่มีวิธีการติดตามโฟลเดอร์ว่าง ลองfind . -type d -emptyแทน
พวกเราทุกคนโมนิก้า

คำตอบ:


530

หากต้องการแสดงรายการไฟล์ที่ไม่ได้ติดตามลอง:

git ls-files --others --exclude-standard

ถ้าคุณต้องการไพพ์เอาท์พุทxargsคุณควรคำนึงถึงช่องว่างสีขาวที่ใช้git ls-files -zและxargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

ชื่อแทนที่ดีสำหรับการเพิ่มไฟล์ที่ไม่ได้ติดตาม:

au = !git add $(git ls-files -o --exclude-standard)

แก้ไข:สำหรับการอ้างอิง: git-ls-files


7
ที่สมบูรณ์แบบ! อะไร!หมายถึงจุดเริ่มต้นของเส้นนามแฝงหรือที่จะได้รับการบันทึก?
พวกเราทุกคนโมนิก้า

@takeshin วิธีรับชื่อไดเรกทอรีหลักเท่านั้น ไม่ใช่โฟลเดอร์ย่อย หมายถึงในไฟล์ที่ไม่ได้ติดตาม: / P / a / ไฟล์, / P / a / ภาพ, / P / a / P /, ... - ฉันแค่ต้องการรายชื่อ / P /
Dr.jacky

2
คุณต้องการใช้นามแฝงในสถานการณ์ใด git add *จะทำในสิ่งเดียวกัน: เพิ่มไฟล์ที่ไม่ได้ติดตามทั้งหมดยกเว้นมาตรฐาน (ไฟล์ที่ครอบคลุมพา ธ.gitignore)
toinetoine

1
ฉันต้องการให้นามแฝงของฉันทำงานอย่างต่อเนื่องในทุกไดเรกทอรีใน repo (คำสั่ง ls-files แสดงเฉพาะไฟล์ที่เปลี่ยนแปลงใน[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
แผนผัง

ขอบคุณ ความคิดเห็นที่ดี
Darth Egregious

71

หากคุณต้องการลบไฟล์ที่ไม่ได้ติดตามให้ทำดังนี้

git clean -df

เพิ่มxไปที่ถ้าคุณต้องการที่จะรวมไฟล์ที่ถูกละเว้นโดยเฉพาะ ผมใช้จำนวนมากตลอดทั้งวันgit clean -dfx

คุณสามารถสร้างคอมไพล์ที่กำหนดเองโดยเพียงแค่เขียนสคริปต์ที่เรียกว่าgit-whateverและมีมันในเส้นทางของคุณ


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

5
เพียงแค่ทำgit add -Aหรือgit add -u(ขึ้นอยู่กับว่าเหมาะสมกับคุณมากขึ้น)
ดัสติน

1
ความคิดเห็นของคุณคือคำตอบที่แท้จริงซึ่งจะถูกทำซ้ำในภายหลังโดย
@Mike

2
และ "git clean -dfxn" สำหรับการใช้งานแบบแห้งโดยเพิ่ม "n"
charo

50

git add -A -nจะทำในสิ่งที่คุณต้องการ -Aเพิ่มไฟล์ที่ไม่ได้ติดตามทั้งหมดลงใน repo -nทำให้เป็นdry-runที่ที่การเพิ่มจะไม่ดำเนินการ แต่เอาท์พุทสถานะจะได้รับรายชื่อแต่ละไฟล์ที่จะถูกเพิ่ม


7
นี่เป็นคำตอบที่ยอดเยี่ยม! หมายเหตุว่ามันไม่รวมไฟล์ใน.gitignoreแฟ้มซึ่งมักจะสิ่งที่เราต้องการ git add -fAnแต่ถ้าไม่
cdunn2001

1
ดูเหมือนว่าคำตอบที่ดีที่สุด
Rob Grant

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

นอกจากนี้ยังแสดงรายการไฟล์ที่แก้ไข
Frank-Rene Schäfer

ดี แต่ฉันได้รับมัน: add '$file'. ในขณะที่git ls-files --exclude-standard -oให้ผลผลิตเปล่า, ท่อร้อน
hyperpallium

28

คำตอบที่ยอมรับจะขัดข้องในชื่อไฟล์ที่มีช่องว่าง ฉันมาถึงจุดนี้ไม่แน่ใจว่าจะอัปเดตคำสั่ง alias อย่างไรดังนั้นฉันจะวางเวอร์ชันที่ปรับปรุงแล้วที่นี่:

git ls-files -z -o --exclude-standard | xargs -0 git add

ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องเพราะมันให้เส้นทางของแต่ละไฟล์เพื่อดำเนินการ (เช่น git add) กับพวกเขาในภายหลัง
Pablo Burgos

27

ทุกอย่างง่ายมาก

ที่จะได้รับรายชื่อของไฟล์ที่ไม่ได้ติดตามทั้งหมดใช้คำสั่งสถานะคอมไพล์ด้วยตัวเลือก-u (--untracked ไฟล์)

git status -u

แล้วรุ่นที่ไม่ใช่แบบเรียกซ้ำ
David

น่าเสียดายที่มันยังแสดงรายการไฟล์ที่ถูกข้ามผ่านไฟล์. gitignore
Plouff

8
นี่คือคำตอบเดียวที่แสดงให้เห็นไฟล์ละเลยของฉันในการเริ่มต้นกระทำ แต่ผมต้องเพิ่ม--ignoredให้กับgit status -uคำสั่ง
DN

เรียบง่าย & ดี
Eric Wang

1
นอกจากนี้ยังแสดงไฟล์ที่แก้ไข ดังนั้นไม่ใช่คำตอบสำหรับคำถาม: แสดงเฉพาะไฟล์ที่ไม่ได้ติดตาม
Wildcard

6

เมื่อค้นหาไฟล์ที่อาจเพิ่ม ผลลัพธ์จากการgit showทำเช่นนั้น แต่มันยังรวมถึงสิ่งอื่น ๆ อีกมากมาย คำสั่งต่อไปนี้มีประโยชน์ในการรับรายการไฟล์เดียวกัน แต่ไม่มีสิ่งอื่นทั้งหมด

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

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

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

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

คุณสามารถใช้การดำเนินการ clean git ด้วย -n (dry run) เพื่อแสดงไฟล์ที่จะลบ (รวมถึงไฟล์. gitignore) โดย:

git clean -xdn

นี่เป็นข้อดีของการแสดงไฟล์ทั้งหมดและโฟลเดอร์ทั้งหมดที่ไม่ได้ติดตาม พารามิเตอร์:

  • x - แสดงไฟล์ที่ไม่ได้ติดตามทั้งหมด (รวมถึงการละเว้นโดย git และอื่น ๆ เช่น build output ฯลฯ ... )
  • d - แสดงไดเรกทอรีที่ไม่ได้ติดตาม
  • n- และที่สำคัญที่สุด! - dryrun คือไม่ได้ลบอะไรเลยเพียงแค่ใช้กลไก clean เพื่อแสดงผลลัพธ์

มันอาจจะเป็นนิด ๆ หน่อย ๆ -nไม่ปลอดภัยที่จะทำเช่นกรณีนี้คุณลืม ดังนั้นฉันมักจะใช้นามแฝงเป็น git config


2

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

git status --porcelain | awk '/^\?\?/ { print $2; }'

หรือ

git status --porcelain | grep -v '\?\?'

ดูเหมือนจะใช้งานไม่ได้กับไฟล์ที่มีพื้นที่ว่างในชื่อของพวกเขา
ssc

-2

ฉันคิดว่ามันจะเหมือนกับโปสเตอร์ต้นฉบับที่ตั้งใจไว้:

git add .


2
ทุกครั้งที่คุณทำgit/svn add .ลูกแมวจะตาย
Nakilon

เฮ้เฉพาะในกรณีที่คุณมี cruft มากมายในสำเนาของสาขาในพื้นที่ห่างไกล;) สร้างสาขาในท้องถิ่นและคุณจะgit add .ได้รับการยกเว้นโทษ!
ทิมฟูลเมอร์

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