Staging ไฟล์ที่ถูกลบ


499

fooว่าฉันมีไฟล์ในพื้นที่เก็บข้อมูลคอมไพล์ของฉันเรียกว่า

สมมติว่ามันถูกลบด้วยrm(ไม่git rm) จากนั้นสถานะ git จะแสดง:

Changes not staged for commit:

    deleted: foo

ฉันจะจัดการการลบไฟล์แต่ละไฟล์ได้อย่างไร

ถ้าฉันลอง:

git add foo

มันบอกว่า:

'foo' did not match any files.

2
นี่เป็นปัญหาของ Git รุ่นเก่าหรือไม่? ทุกวันนี้มันดูเหมือนจะไม่เป็นหนึ่งเดียวมันทำงานคล้ายกับไฟล์ที่ถูกดัดแปลง
cst1992

คำตอบ:


22

ตั้งแต่ Git 2.0.0 git addจะทำการลบไฟล์ด้วย

Git 2.0.0 เอกสาร - git-add

<pathspec> ...

ไฟล์ที่จะเพิ่มเนื้อหาจาก Fileglobs (เช่น * .c) สามารถให้เพิ่มไฟล์ทั้งหมดที่ตรงกันได้ นอกจากนี้ยังสามารถกำหนดชื่อไดเรกทอรีชั้นนำ (เช่น dir เพื่อเพิ่ม dir / file1 และ dir / file2) เพื่อปรับปรุงดัชนีให้ตรงกับสถานะปัจจุบันของไดเรกทอรีโดยรวม (เช่นการระบุ dir จะบันทึกไม่ใช่แค่ไฟล์ dir / file1 ที่แก้ไข ในแผนผังการทำงานไฟล์ dir / file2 ถูกเพิ่มไปยังแผนผังการทำงาน แต่ยังรวมถึงไฟล์ dir / file3 ที่ถูกลบออกจากแผนผังการทำงานโปรดทราบว่า Git รุ่นเก่าใช้เพื่อละเว้นไฟล์ที่ถูกลบใช้ - ไม่มีตัวเลือกทั้งหมดหากคุณ ต้องการเพิ่มไฟล์ที่แก้ไขหรือใหม่ แต่ไม่สนใจไฟล์ที่ถูกลบ


คำตอบที่ได้รับการยอมรับไม่สามารถแก้ปัญหาได้ - และอีกคำตอบนั้นยุ่งยากกว่าตั้งแต่ Git 2.0.0 - นี่เป็นวิธีที่ดีที่สุด! คุณมี upvote ของฉัน
João Antunes

518

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

หากต้องการจัดไฟล์สำหรับการลบโดยไม่ต้องลบออกจากระบบไฟล์ให้ใช้ git rm --cached foo


8
นอกจากนี้คุณสามารถเพิ่มการ--cacheตั้งค่าสถานะเพื่อลบไฟล์ออกจากพื้นที่เก็บข้อมูลเท่านั้นและไม่ต้องแตะต้องในระบบไฟล์
Hauleth

กระบวนการในการยกเลิกการดำเนินการนี้คือยกเลิกการทำขั้นตอนการลบไฟล์ เป็นไปได้ไหม
longda

82
ที่จริง OP ถามว่าเวทีalready_deletedgit status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}"ไฟล์และนี้สามารถทำได้โดย คำตอบอื่น ๆ ดูเหมือนจะแสดงวิธีการจัดการไฟล์ที่ลบอย่างถูกต้อง (แต่ไม่ใช่วิธีที่จะจัดเวทีไฟล์ที่ลบไปแล้ว) PS xargsคำสั่งตามการทำงานสำหรับฉันบน Ubuntu 12.04 แต่เมื่อฉันเองทำgit add -u deleted_file.txtมัน doens't ทำงาน คอมไพล์ของฉันคือ 1.7.9.5
Dimitry K

8
@DimitryK: git rmจะทำการลบไฟล์อย่างมีความสุขแม้ว่าไฟล์นั้นจะถูกลบออกจากระบบไฟล์แล้วก็ตาม และเมื่อความเห็นของ OP เกี่ยวกับคำตอบอื่นชี้ให้เห็นพวกเขาต้องการจัดเตรียมไฟล์หนึ่งไฟล์ที่ถูกลบไปแล้ว
Wooble

3
git rmไม่สเตจที่ลบไฟล์แล้ว มันพ่นข้อผิดพลาดนี้: fatal: pathspec '~.SLDASM' did not match any files. นี่คือหน้าจอที่มีหลักฐาน: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png ภาพหน้าจอแรกแสดงให้เห็นชัดเจนว่า 2 ไฟล์ถูกลบและไม่จัดฉากภาพหน้าจอที่สองแสดงว่าเมื่อฉันพิมพ์git rm "~$Box.SLDASM"มันจะพ่นข้อผิดพลาดนี้
KulaGGin

413

แม้ว่ามันจะเป็นเรื่องที่ถูกต้องเพื่อใช้ผลัดที่คุณสามารถทำได้git rm [FILE]git add -u

ตามgit-addเอกสาร:

-u - อัปเดต

อัปเดตดัชนีที่ซึ่งมีรายการที่ตรงกับ [ไฟล์] อยู่แล้ว สิ่งนี้จะลบและปรับเปลี่ยนรายการดัชนีเพื่อให้ตรงกับแผนผังการทำงาน แต่ไม่เพิ่มไฟล์ใหม่

หากไม่มีการกำหนด [ไฟล์] เมื่อใช้ตัวเลือก -u ไฟล์ที่ติดตามทั้งหมดในแผนผังการทำงานทั้งหมดจะได้รับการอัปเดต (Git เวอร์ชันเก่าที่ใช้เพื่อ จำกัด การอัปเดตไปยังไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย)

เมื่อใดที่ดัชนีจะถูกรีเฟรชและไฟล์จะถูกจัดฉากอย่างเหมาะสม


56
ใช่git add -A .จะเพิ่มการเปลี่ยนแปลงทั้งหมดฉันต้องการแสดงไฟล์ที่ลบหนึ่งไฟล์โดยเฉพาะ
Andrew Tomazos

25
นี่จะเป็นการเพิ่มไฟล์ที่แก้ไขทั้งหมด ไม่เพียงแค่ลบไฟล์
Foreever

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

9
มีวิธีการเฉพาะไฟล์ที่ลบขั้นตอนและไม่ได้แก้ไขหรือไม่? แค่สงสัย.
สิงหาคม

11
ฉันทำgit add -u FolderWithDeletedFiles/และทำในสิ่งที่ฉันต้องการขอบคุณ
รัฐสภา

158

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

git rm $(git ls-files --deleted)

ในการเพิ่มนามแฝงในคำสั่งนี้ให้git rm-deletedรัน:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'

2
สัญกรณ์ $ () aparently ไม่มีอยู่ในคอนโซล bash ของ windows ซึ่งนำไปสู่unknown option `deleted)
Félix Gagnon-Grenier

2
ฉันไม่คิดว่ามันจะทำงานถ้าคุณมีช่องว่างในเส้นทางของคุณเช่นกัน อย่างน้อยมันก็ไม่ได้อยู่ในระบบของฉัน (ด้วย zsh)
Wil Shipley

3
ทำงานอย่างสมบูรณ์แบบสำหรับฉัน! ทำในสิ่งที่ฉันต้องการ ขอบคุณมากที่นี่!
RedSands

ใน windows dofor /F %I in ('git ls-files --deleted') do git add -u %I
eis

3
สิ่งนี้ใช้ไม่ได้กับชื่อไฟล์ที่มีช่องว่าง 'git add -u' ทำได้ถ้าต้องการ
J-Dizzle

33

เพื่อเพิ่มไฟล์ที่ถูกลบพร้อมทั้งหมด

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all

ขอบคุณตรวจสอบเพื่อให้แน่ใจว่า

git status

คุณควรจะไปดี


5
ยืนยันว่าได้ผล ฉันคิดว่าบทเรียนที่นี่จะต้องไม่ทำrm <file>แต่ควรทำgit rm <file>
DanGordon

1
FYI: การตัดช่องว่างทำให้เกิดปัญหาหากเส้นทางใดมีช่องว่างในนั้น
วิส

1
สิ่งนี้ใช้ไม่ได้กับชื่อไฟล์ที่มีช่องว่าง 'git add -u' ทำได้ถ้าต้องการ
J-Dizzle

git version 2.15.2 (Apple Git-101.1)ทำงานอย่างสมบูรณ์แบบสำหรับฉันใน
Kalob Taulien

ทำงานได้อย่างสมบูรณ์บน linux console!
Ahmed AMMOURI



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