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.



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 .

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 ..


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"

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

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).


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.


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.


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.


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.


29

Jika itu adalah satu-satunya perubahan, Anda bisa melakukannya

git commit -a

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


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.

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.


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


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

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.


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"

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


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

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 ...


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.


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

Ini bekerja untuk saya setelah saya menghapus file.


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.


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


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.


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.


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

1

sesuatu seperti

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

mungkin melakukannya.


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


-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).


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.