Menghapus banyak file dari repo Git yang sudah dihapus dari disk

1311

Saya memiliki repo Git yang telah saya hapus empat file dari menggunakan rm( tidak git rm ), dan status Git saya terlihat seperti ini:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

Bagaimana cara menghapus file-file ini dari Git tanpa harus melalui secara manual dan menambahkan setiap file seperti ini:

git rm file1 file2 file3 file4

Idealnya, saya mencari sesuatu yang berfungsi dengan cara yang git add .sama, jika itu mungkin.

Codebeef
sumber
10
@seth, itu tidak selalu nyaman untuk digunakan git rm, penghapusan bisa saja dari alat terpisah, IDE atau file manager. Visual Studio untuk satu orang bisa terasa sakit ketika menghapus / mengganti nama file.
Brett Ryan
67
Ugh, menanyakan mengapa seseorang tidak menggunakan git rmsama seperti menanyakan mengapa mereka tidak menggunakan git vimatau git cd. Ini hal yang bodoh untuk dilakukan, dan git harus memiliki perintah bawaan atau alias untuk menghapus file yang dihapus dari pementasan, dan Anda tidak harus mencarinya di SO atau membaca halaman manual saat istirahat makan siang Anda.
WCWedin
7
Jawaban Varinder bukanlah cara yang baik. Pertimbangkan git add -u seperti yang disarankan Cody dan yang juga merupakan jawaban untuk pertanyaan ini: stackoverflow.com/questions/1402776/…
Roland

Jawaban:

2300

Untuk Git 1.x

$ git add -u

Ini memberitahu git untuk secara otomatis mengatur file yang dilacak - termasuk menghapus file yang sebelumnya dilacak.

Untuk Git 2.0

Untuk menggelar seluruh pohon kerja Anda:

$ git add -u :/

Untuk menampilkan hanya jalur saat ini:

$ git add -u .
carl
sumber
133
Perhatikan bahwa ini akan menambahkan semua file yang diubah, dilacak - dihapus dan diperbarui.
Ian Hunter
19
@beanland, Anda hanya perlu memberikan path ke file tertentu yang ingin Anda modifikasi jika Anda tidak ingin semuanya. eg git add -u [path]
Paul Prewett
27
juga git add -u folder/untuk menjalankan operasi ini dalam folder
c ..
2
FYI: jawaban ini bergabung dari stackoverflow.com/questions/1402776/…
Shog9
1
Mungkin itu pertanyaan yang diajukan orang ketika mereka sampai di halaman ini, dan itu mungkin yang ingin ditanyakan oleh OP, tetapi itu tidak menjawab pertanyaan yang diajukan.
Relequestual
1362
git ls-files --deleted -z | xargs -0 git rm 

mungkin apa yang Anda cari .. itu bekerja untuk saya ..

Varinder
sumber
5
untuk windows coba tambahkan alias berikut ini di konfigurasi Anda tanpa tanda kutip seperti yang dinyatakan di atas oleh Evan Moran 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS
21
waspada terhadap file-file dengan spasi di namanya
maazza
44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy
15
git add -u seperti yang disarankan Cody adalah cara yang jauh lebih sederhana dan aman, tidak ada risiko menghapus file secara tidak sengaja.
Roland
4
Mengundurkan diri karena ini adalah jawaban yang salah bahkan jika itu mungkin berfungsi untuk beberapa file. gunakan "git add -u" di bawah ini. Itu untuk apa.
n13
733

Kamu bisa menggunakan

git add -u

Untuk menambahkan file yang dihapus ke area pementasan, kemudian komit

git commit -m "Deleted files manually"
Cody Caughlan
sumber
101
Harap perhatikan pengguna Google: Ini menambahkan file yang dilacak yang dimodifikasi ke area pementasan juga.
erenon
4
Jalankan perintah ini hanya jika Anda baru saja menghapus file dan ingin segera mem-stage-nya.
Aryo
1
saya tidak dapat menghapus file dari bitbucket repo]
srinivas gowda
356

Jika Anda hanya menjalankan:

git add -u

git akan memperbarui indeksnya untuk mengetahui bahwa file yang telah Anda hapus sebenarnya harus menjadi bagian dari komit berikutnya. Kemudian Anda dapat menjalankan "git commit" untuk memeriksa perubahan itu.

Atau, jika Anda menjalankan:

git commit -a

Secara otomatis akan mengambil perubahan ini (dan yang lainnya) dan mengkomitnya.

Pembaruan : Jika Anda hanya ingin menambahkan file yang dihapus, coba:

git ls-files --deleted -z | xargs -0 git rm
git commit
Emil Sit
sumber
1
Benar, git commit -aakan melakukan apa yang saya inginkan, kecuali dalam beberapa kasus saya memiliki file yang saya tidak ingin komit, jadi saya ingin menyiapkan komit secara manual.
Igor Zevaka
2
commit -a pada dasarnya melakukan "add -u" terlebih dahulu; itu akan memperbarui indeks dengan perubahan apa pun pada file yang diketahui (baik penghapusan atau perubahan sederhana). Anda tentu saja dapat lebih spesifik dan menambahkan / rm hanya file yang Anda inginkan. git.or.cz/gitwiki/… mungkin membantu.
Emil Sit
2
Set perintah di bawah "Perbarui: .." bekerja seperti pesona. Terima kasih!
Jay Taylor
10
Terima kasih banyak untuk 'git ls-files --deleted | xargs git rm '!
mit
18
"git ls-files --deleted | xargs git rm" adalah jawaban yang benar! Terima kasih!
reto
166

Anda mungkin mencari -A:

git add -A

ini mirip dengan git add -u, tetapi juga menambahkan file baru. Ini kira-kira setara dengan addremoveperintah hg (meskipun deteksi gerakan otomatis).

Dustin
sumber
8
Pada catatan samping yang cepat, menggunakan -u membatasi penambahan ke file yang dilacak dan -a akan menyertakan file yang tidak terlacak juga. Saya pikir saya akan menunjukkan perbedaannya.
spaaarky21
Pada tahap ini Anda bisa menambahkan semua melalui komit -a flag.
Zac Grierson
94

Untuk tahap hanya dihapus file:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

Atau (cara xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

Anda dapat alias mengatur perintah pilihan Anda untuk penggunaan yang nyaman di kemudian hari.

Saeb Amini
sumber
2
@ Saeb Memahami tentang antrian, tetapi xargssekitar 15 menit untuk dikuasai.
Eric Wilson
11
git status | awk '/deleted/ {print $3}' | xargs git rmakan menjadi cara yang lebih singkat untuk melakukan itu. grep | awk... Katakan Saja No.
Mark Reed
58
git rm $(git ls-files --deleted)bukankah ini lebih nyaman (disalin dari ini ).
Hotschke
1
xargs atau substitusi $ () di atas jika Anda tahu daftarnya tidak besar. Jika daftarnya sangat besar: git ls-files --deleted | while read f; do git rm $f; done
Andrew
2
@Andrew xargsmungkin lebih efisien daripada loop sementara untuk daftar besar, karena melewati lebih dari satu argumen setiap kali dijalankan git rm. Untuk membatasi jumlah argumen yang diteruskan ke git rmsetiap kali dieksekusi, gunakan -nopsi:git ls-files --deleted | xargs -n 15 git rm
Ajedi32
61
git rm test.txt

Sebelum atau setelah Anda menghapus file yang sebenarnya.

Peaker
sumber
7
Sementara itu akan berhasil, saya sering menemukan diri saya menghapus satu ton file hanya melalui rmdan menyesalinya nanti.
carl
4
Mengapa ini lebih buruk daripada melakukan git add -u? Sepertinya akan lebih aman untuk menambahkan file tertentu yang dihapus ke komit, daripada menambahkan SEMUA perubahan.
Ian Dunn
2
sebenarnya ini harus menjadi jawaban terbaik sesuai dengan baris terakhir pertanyaan "Saya hanya ingin perintah yang menghapus semua file dari git yang juga dihapus dari disk."
Ramsharan
2
@ Ramsharan tidak, karena tidak melakukan itu sama sekali. Ini menghapus satu file; OP secara khusus meminta "semua" file yang dihapus.
Adam
1
@ Ramsharan tidak, itu intinya - dalam hampir semua kasus Anda TIDAK BISA hanya menggunakan wildcard (tidak ada wildcard yang akan cocok). Inilah sebabnya mengapa ada jawaban utama yang jauh lebih rumit.
Adam
49

Dengan menggunakan git-add dengan opsi '--all' atau '--update' Anda mungkin mendapatkan lebih dari yang Anda inginkan. File baru dan / atau yang dimodifikasi juga akan ditambahkan ke indeks. Saya memiliki setup alias bash ketika saya ingin menghapus file yang dihapus dari git tanpa menyentuh file lain:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Semua file yang telah dihapus dari sistem file ditambahkan ke indeks sebagai dihapus.

zobie
sumber
39

Bukan berarti itu penting, tetapi saya tidak setuju dengan jawaban yang dipilih:

git add -u 

... akan menghapus file dari indeks jika file yang sesuai di pohon kerja telah dihapus, tetapi itu juga akan menggubah konten baru yang dimodifikasi dari file yang dilacak.

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

... di sisi lain hanya akan rm file yang dihapus yang dilacak.

Jadi yang terakhir dalam pandangan saya adalah opsi yang lebih baik.

Stephan Tual
sumber
29

Jika itu adalah satu-satunya perubahan, Anda bisa melakukannya

git commit -a

untuk melakukan semua perubahan. Itu akan termasuk file yang dihapus.

SpoonMeiser
sumber
3
Tidak yakin mengapa saya terpilih; git melakukan pekerjaan yang baik untuk mengidentifikasi file yang telah dihapus, bahkan jika Anda belum secara eksplisit mengatakannya dengan menggunakan git rm.
SpoonMeiser
Anda terpilih karena "-a" bukan saklar yang bisa diterima, itu "-A". Mengedit jawaban Anda.
Sheharyar
10
Tidak, "-a" adalah switch yang dapat diterima, karena perintahnya adalah commit . "-A" adalah saklar untuk menambahkan tetapi tidak melakukan . Saya melihat hasil edit yang Anda sarankan sudah ditolak.
SpoonMeiser
Jika satu-satunya hal yang Anda lakukan adalah file yang dihapus, tambahkan saklar --allow-empty
billrichards
err, sebenarnya - cukup kosong hanya diperlukan jika Anda melakukan git rm
--cached
20
git ls-files --deleted | xargs git rm 

adalah opsi terbaik untuk menambahkan hanya file yang dihapus.

Berikut ini beberapa opsi lain.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
Sijo Kurian
sumber
16

git add -u

-u --perbarui Hanya cocok dengan file yang sudah dilacak di indeks daripada pohon yang bekerja. Itu berarti bahwa ia tidak akan pernah mem-stage file baru, tetapi itu akan stage memodifikasi konten baru dari file yang dilacak dan bahwa itu akan menghapus file dari indeks jika file yang sesuai di pohon kerja telah dihapus.

Jika tidak diberikan, default ke "."; dengan kata lain, perbarui semua file yang dilacak di direktori saat ini dan subdirektori.

Obay
sumber
Jawaban dengan suara terbanyak sudah dikatakan digunakan git add -u. Dari mana semua hal lain dalam jawaban Anda berasal, dokumentasi? Anda harus menautkan ke dokumentasi dan memblokirnya jika ada.
TheWarriorNamedFoo
14

Solusi sederhana itu berfungsi baik untuk saya:

git rm $(git ls-files --deleted)
Houssem Badri
sumber
Saya pikir Anda harus selalu menggunakan git shell pada Anda direktori kerja saat ini
Houssem Badri
2
Ini bagus dan sederhana tetapi tidak berfungsi dengan folder rekursif.
DrB
@BehnazChangizi Saya pikir tidak, stackoverflow.com/questions/1054044/...
Houssem Badri
@PvdL tidak menerima ruang di jalan adalah masalah os-specefic
Houssem Badri
11

Jika Anda ingin menambahkannya ke Anda .gitconfiglakukan ini:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

Maka yang harus Anda lakukan adalah menjalankan:

git rma
Evan Moran
sumber
1
dan dari cmd linegit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey
9
git ls-files --deleted -z | xargs -0 git rm --cached

Ini akan menghapus semua file yang dihapus yang sebelumnya dilacak oleh git, serta menangani kasus di mana nama file Anda memiliki ruang di dalamnya.

Bergantung pada varian POSIX Anda, Anda mungkin perlu menggunakan xargs -0 -r: ini akan menyebabkan xargskeluar dengan anggun ketika mengirim konten kosong.

EDIT: --cacheddan --deletedflag digunakan bersama-sama untuk menjaga terhadap penghapusan file yang belum dihapus secara tidak sengaja.

Bahaya Murphy
sumber
7

Beri tahu perintah untuk secara otomatis membuat file yang telah dimodifikasi dan dihapus, tetapi file baru yang belum Anda beri tahu tentang Git tidak terpengaruh:

-a
--all

git add . && git commit -m -a "Your commit"

atau

git add --all && git commit -m "Your commit"
ilgam
sumber
1
git add --all && git commit -m "Your commit" Ini bekerja untuk saya di windows-7, menggunakan shell perintah Git bash.
kmarabet
1
Perintah berikut bekerja untuk saya di windows-7, menggunakan shell perintah Git bash: $ git add --all && git commit -m "hapus file properti" [master 58c41ac] hapus file properti 1 file diubah, 9 penghapusan (-). .. Kemudian untuk mendorong perubahan yang dikomit itu ke repositori jarak jauh telah menjalankan: $ git push origin .. Menghitung objek: 10, selesai.
kmarabet
6

Berikut ini akan berfungsi, bahkan jika Anda memiliki banyak file untuk diproses:

git ls-files --deleted | xargs git rm

Anda mungkin juga ingin berkomentar.

Untuk detailnya, lihat: Skrip Git yang Berguna

l3x
sumber
6

Silakan gunakan -tuntuk melihat perintah mana yang sebenarnya sedang dijalankan

Saya baru saja men-tweak jawaban Virender untuk melakukan hal yang sama:

git ls-files --deleted -z | xargs -t -0 git rm
Venkateswara Rao
sumber
5

Tak satu pun dari flag untuk git-add hanya akan mem-stage file yang dihapus; jika semua yang Anda modifikasi adalah file yang dihapus, maka Anda baik-baik saja, tetapi sebaliknya, Anda perlu menjalankan git-status dan mengurai hasilnya.

Menolak jawaban Jeremy, inilah yang saya dapat:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Dapatkan status file.
  2. Untuk file yang dihapus, isolasi nama file tersebut.
  3. Hapus semua baris yang dimulai dengan #s, serta baris status yang memiliki kata "dihapus" di dalamnya; Saya tidak ingat apa itu sebenarnya, dan tidak ada lagi, jadi Anda mungkin harus memodifikasi ini untuk situasi yang berbeda. Saya pikir pengelompokan ekspresi mungkin adalah fitur khusus GNU, jadi jika Anda tidak menggunakan gnutil, Anda mungkin harus menambahkan beberapagrep -v baris.
  4. Lewati file ke git rm.

Menempelkan ini ke dalam shell alias sekarang ...

Xiong Chiamiov
sumber
5

Seperti yang telah disebutkan

git add -u

tahap file yang dihapus untuk dihapus, TETAPI JUGA file yang dimodifikasi untuk pembaruan.

Untuk membatalkan tahapan file yang dimodifikasi dapat Anda lakukan

git reset HEAD <path>

jika Anda ingin menjaga komitmen Anda terorganisir dan bersih.
CATATAN: Ini juga bisa menghapus stage file yang dihapus, jadi berhati-hatilah dengan wildcard itu.

DarkNeuron
sumber
4
git commit -m 'commit msg' $(git ls-files --deleted)

Ini bekerja untuk saya setelah saya menghapus file.

Chad
sumber
3

Saya membutuhkan tombol "ubah panggung" yang sama dan menggunakan git gui. itu juga menambahkan semua.

Dan setelah "tahap berubah" saya membuat "komit" ...

jadi direktori kerja saya bersih lagi.

Serdar
sumber
Menggunakan gui dengan baik adalah MENIPU, lol! Tetapi lebih cepat dalam kasus di mana desainer GUI memenuhi kebutuhan Anda. Adalah baik untuk mengetahui cara bermain-main dengan 'apa yang ada di bawah tenda'.
Dennis
1
FYI: jawaban ini bergabung dari stackoverflow.com/questions/1402776/…
Shog9
3
git rm $(git ls-files -d)

Menghapus semua file yang terdaftar berdasarkan git ls-filesperintah (-d hanya menampilkan file yang dihapus). Tidak berfungsi untuk file dengan spasi di nama file atau path, tetapi mudah diingat

A. Albershteyn
sumber
2

Anda dapat menggunakan git add -u <filenames>untuk mem-stage file yang dihapus saja.

Misalnya, jika Anda menghapus file templates/*.tpl, maka gunakan git add -u templates/*.tpl.

The -udiperlukan dalam rangka untuk merujuk ke file yang ada di repositori tetapi tidak lagi ada di direktori kerja. Jika tidak, defaultnya git addadalah untuk mencari file di direktori kerja, dan jika Anda menentukan file yang Anda hapus di sana, itu tidak akan menemukannya.

thomasrutter
sumber
2

Menambahkan alias sistem untuk pementasan file yang dihapus sebagai perintah rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

WINDOWS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Catatan

Windows harus bashdiinstal.

Haris Krajina
sumber
2

(Namun variasi lain)

Saya ingin menghapus semua yang sudah dihapus dari file disk tetapi dari satu folder tertentu, membiarkan folder lain tidak tersentuh. Berikut ini bekerja untuk saya:

git ls-files --deleted  | grep <folder-name> | xargs git rm
urban
sumber
1

sesuatu seperti

git status | sed -s "s/^.*deleted: //" | xargs git rm 

mungkin melakukannya.

Jeremy French
sumber
2019 git versi 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841
1

Untuk proyek studio visual

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

yang berguna ketika jalur file yang dihapus memiliki ruang

Penggergaji
sumber
-1

Solusi paling fleksibel yang saya temukan hingga saat ini adalah untuk

git cola

Dan pilih semua file yang dihapus yang ingin saya tampilkan.

(Catatan Saya biasanya melakukan semua commandline di git, tetapi git menangani file yang dihapus agak canggung).

Broes De Cat
sumber
Wildcard tidak berfungsi untuk saya, git add -u path/to/my/deleted-files-pattern-*.ymljadi ini adalah jawaban terbaik bagi saya (tidak ingin menampilkan semua file yang dihapus, tetapi 50 dari beberapa ratus).
mlncn