Pementasan file terhapus

499

Katakanlah saya punya file di repositori git saya foo.

Misalkan sudah dihapus dengan rm(tidak git rm). Maka status git akan menunjukkan:

Changes not staged for commit:

    deleted: foo

Bagaimana cara saya menghapus file individual ini?

Jika saya mencoba:

git add foo

Ia mengatakan:

'foo' did not match any files.
Andrew Tomazos
sumber
2
Apakah ini masalah di versi Git lama? Saat ini sepertinya tidak menjadi satu, ia bekerja mirip dengan file yang dimodifikasi.
cst1992

Jawaban:

22

Sejak Git 2.0.0, git addjuga akan melakukan penghapusan file.

Git 2.0.0 Documents - git-add

<pathspec> ...

File untuk menambahkan konten. Fileglobs (misalnya * .c) dapat diberikan untuk menambahkan semua> file yang cocok. Juga nama direktori terkemuka (mis. Dir untuk menambahkan dir / file1 dan dir / file2) dapat diberikan untuk memperbarui indeks agar sesuai dengan keadaan direktori saat ini secara keseluruhan (mis., Menentukan direktori akan merekam bukan hanya direktori file / modifikasi file1) di pohon kerja, dir file / file2 ditambahkan ke pohon kerja, tetapi juga file dir / file3 dihapus dari pohon kerja. Perhatikan bahwa versi lama dari Git digunakan untuk mengabaikan file yang dihapus; gunakan opsi --no-all jika Anda ingin menambahkan file yang dimodifikasi atau baru tetapi abaikan yang dihapus.

peflorencio
sumber
Jawaban yang diterima tidak menyelesaikan masalah - dan yang lainnya lebih rumit sejak Git 2.0.0 - ini adalah cara terbaik! Anda mendapat dukungan saya
João Antunes
519

Gunakan git rm foountuk menampilkan file untuk dihapus. (Ini juga akan menghapus file dari sistem file, jika belum pernah dihapus sebelumnya. Tentu saja, dapat dipulihkan dari git, karena sebelumnya sudah diperiksa.)

Untuk melakukan tahap penghapusan file tanpa menghapusnya dari sistem file, gunakan git rm --cached foo

Wooble
sumber
8
Anda juga dapat menambahkan --cacheflag untuk menghapus file hanya dari repositori, dan membiarkannya tidak tersentuh dalam filesystem.
Hauleth
Apa yang akan menjadi proses untuk membatalkan operasi ini, yaitu, menghapus stage file untuk dihapus? Apakah itu mungkin?
longda
82
Sebenarnya OP bertanya bagaimana cara mem- stage file yang sudah dihapus dan ini bisa dilakukan oleh git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". Jawaban lain tampaknya menunjukkan cara mem-stage penghapusan file dengan benar (tetapi tidak bagaimana mem-stage file yang sudah dihapus). ps. yang xargsperintah berbasis bekerja untuk saya pada Ubuntu 12.04, namun ketika saya secara manual melakukan git add -u deleted_file.txtitu doens't pekerjaan. Git saya adalah 1.7.9.5
Dimitry K
8
@ DimitryK: git rmdengan senang hati akan mem -stage file untuk dihapus walaupun sudah dihapus dari sistem file. Dan seperti komentar OP pada jawaban lain, mereka ingin membuat satu file spesifik yang sudah dihapus.
Wooble
3
git rmbelum menampilkan file yang sudah dihapus. Melempar kesalahan ini: fatal: pathspec '~.SLDASM' did not match any files. Berikut layar dengan bukti: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . Tangkapan layar pertama dengan jelas menunjukkan bahwa 2 file dihapus dan tidak dipentaskan, tangkapan layar kedua menunjukkan bahwa ketika saya mengetik git rm "~$Box.SLDASM", ia melempar kesalahan ini.
KulaGGin
413

Meskipun itu benar untuk digunakan git rm [FILE], atau Anda dapat melakukannya git add -u.

Menurut git-adddokumentasi:

-u --perbarui

Perbarui indeks di tempat yang sudah memiliki entri yang cocok dengan [FILE]. Ini menghapus serta memodifikasi entri indeks agar sesuai dengan pohon kerja, tetapi tidak menambahkan file baru.

Jika tidak ada [FILE] diberikan ketika opsi -u digunakan, semua file yang dilacak di seluruh pohon kerja diperbarui (Git versi lama digunakan untuk membatasi pembaruan ke direktori saat ini dan subdirektori).

Indeks akan di-refresh dan file akan dipentaskan dengan benar.

Sailesh
sumber
56
Ya git add -A .akan menambahkan semua perubahan, saya secara khusus ingin membuat satu file terhapus.
Andrew Tomazos
25
Ini akan menambahkan semua file yang dimodifikasi; Bukan hanya file yang dihapus.
Foreever
3
Itu betul. Lebih khusus lagi, ini akan menampilkan semua perubahan dalam file yang sudah dilacak, apakah dihapus atau hanya dimodifikasi. Ini membantu saat Anda menghapus banyak file dan tidak ingin mengaturnya satu per satu.
Sailesh
9
Apakah ada cara untuk hanya mem-stage file yang dihapus dan tidak dimodifikasi? Hanya penasaran.
Agustus
11
Saya melakukan git add -u FolderWithDeletedFiles/dan itu melakukan apa yang saya inginkan, terima kasih
parlemen
158

Untuk mengatur semua file yang dihapus secara manual, Anda dapat menggunakan:

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

Untuk menambahkan alias ke perintah ini sebagai git rm-deleted, jalankan:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Ian Mackinnon
sumber
2
notasi $ () tidak ada di konsol windows bash, yang mengarah keunknown option `deleted)
Félix Gagnon-Grenier
2
Saya pikir ini tidak akan berhasil jika Anda memiliki ruang di jalur Anda. Setidaknya, itu tidak ada di sistem saya (dengan zsh).
Wil Shipley
3
Bekerja dengan sempurna untuk saya! Melakukan persis apa yang saya butuhkan. Apresiasi besar di sini!
RedSands
Di windows dofor /F %I in ('git ls-files --deleted') do git add -u %I
eis
3
ini tidak bekerja untuk nama file dengan spasi, 'git add -u' tidak jika diperlukan.
J-Dizzle
33

untuk menambahkan semua file yang siap dihapus

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

terima kasih untuk memastikan

git status

kamu harus baik untuk pergi

chet corey
sumber
5
Mengkonfirmasi bahwa ini berfungsi. Saya pikir pelajaran di sini adalah untuk tidak melakukan rm <file>, tetapigit rm <file>
DanGordon
1
FYI: memotong spasi menyebabkan masalah jika ada jalur di dalamnya
davis
1
ini tidak bekerja untuk nama file dengan spasi, 'git add -u' tidak jika diperlukan.
J-Dizzle
Bekerja dengan baik untuk saya git version 2.15.2 (Apple Git-101.1).
Kalob Taulien
berfungsi dengan baik di konsol linux!
Ahmed AMMOURI
8

Kamu bisa menggunakan

git rm -r --cached -- "path/to/directory"

untuk membuat direktori yang dihapus.

Script Game
sumber
8

Anda dapat menggunakan perintah ini

git add  `git ls-files --deleted`
gnana jeyam95
sumber
0

bagi yang menggunakan git 2.x + di PowerShell:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
orion elenzil
sumber