Git deposunda birden çok silinmiş dosya nasıl kaldırılır


237

Bazı dosyaları sildim ve git durumu aşağıdaki gibi görünüyor.

Karar verdim ve ittim.

GitHub hala depodaki silinmiş dosyaları gösterir. GitHub deposundaki dosyaları nasıl silebilirim?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

Eğer kullanırsam git rm, aşağıdakileri verir.

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched


Yanıtlar:


638
git add -u 

tüm değişikliklerinizi günceller


31
Bir cazibe çalışır. "Git status | sed -n '/ ^ # * silindi: / s /// p' | xargs git rm" gibi basit ama sık rastlanan bir gereksinim için önerilen bir çözüm olarak gördüğünüzde, daha iyi bir çözüm olduğunu bilirsiniz, ya da yakında, köşede olacak.
arcseldon

basit daha iyidir, bu gerçekten "bash" yolu sonra kullanışlı
castiel

1
Yazar dosyaları nasıl kaldıracağını soruyor, neden dosya eklemek doğru cevap?
kelin

3
@kelin: from git docs ( git-scm.com/docs/git-add ): "-u --update Dizini, zaten <pathspec> ile eşleşen bir girişin olduğu yerde güncelleyin. Bu işlem, dizin girişlerini kaldırır ve değiştirir. -u seçeneği kullanıldığında hiçbir <pathspec> verilmezse, tüm çalışma ağacındaki tüm izlenen dosyalar güncellenir (Git'in eski sürümleri güncellemeyi geçerli dizine sınırlamak için kullanılır ve alt dizinleri). "
HEDMON

92

Çok dikkatli olun git rm .; istediğinizden daha fazlasını kaldırabilir. Tabii ki, iyileşebilirsiniz, ancak bunu yapmak zorunda değilsiniz.

En basit olanı:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

Dosyalar bulunmadığından kabuk joker karakterlerini kullanamazsınız, ancak kullanabilirsiniz (en azından Bash'te):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

Veya şunu düşünün:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

Bu çıktısını alır git statusvarsayılan (bir şey yazmıyor, sed -n), fakat başlangıç hatlarında # deleted:, bu kurtulmak alır #ve deleted:ve baskılar neyi kalır; xargsargümanları toplar ve bir git rmkomuta sağlar. Bu, adlardaki benzerlikten (veya farklılıktan) bağımsız olarak herhangi bir sayıda dosya için çalışır.


6
Sen edebilirsiniz (onları kaçmak için gerekebilir) joker kullanabilir ve bunun önemi onlar dosya sistemi üzerinde var olmadığı; bu nedenle git, sadece bu çalışma ağacında, endekste yolları eşleşir.
Ben James

109
git diff --diff-filter=D --name-only -z | xargs -0 git rm ayrıştırmaya çalışmaktan daha güvenilir bir yaklaşımdır git statuskullanıcı odaklı olan ve gelecekteki sürümlerde kararlı olduğu garanti edilmeyen .
CB Bailey

@Charles: bu kesinlikle daha iyi, ama hangi seçeneklerin mevcut olduğu hakkında oldukça fazla bilgi gerektirir git diff(ki daha önce ihtiyacım yoktu). Teşekkürler!
Jonathan Leffler

8
Ayrıca "git ls-files --deleted" olduğunu unutmayın
Petr Gladkikh

1
böylece, git ls-files --deleted | xargs git rmbenim için hile yaptı.
fiacobelli

50

ByScripts yanıtının başka bir sürümü

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

Bu SADECE silinen dosyaları git'ten kaldıracaktır.

Ayrıca SADECE değiştirilmiş dosyaları eklemek için de kullanılabilir.

git add $(git ls-files --modified)

Bu komutlar Windows için gitbash üzerinde de çalışır.


2
Paha biçilemez, git ls-filessilinen veya değiştirilen durum çok yardımcı olur.
Mario Peshev

1
'git add --update (or -u)'Ağacın bir alt dizininden yol bağımsız değişkeni olmadan davranışı Git 2.0'da değişecektir ve artık kullanılmamalıdır. Tüm ağacın içeriğini eklemek için şu git add --update :/ komutu çalıştırın: (veya git add -u: /) Komutu geçerli dizine kısıtlamak için şu komutu çalıştırın: git add --update . (veya git add -u.) Geçerli Git sürümünde komut, geçerli dizin
Ans

1
İçlerindeki boşluklara sahip yolları nasıl kullanacağınız hakkında bir fikriniz var mı? Örnek: src/my spaced directory/myfile. Bu ayrı ayrı ele alınabilir, ancak bu cevaptaki komutlar kullanılarak nasıl ele alınabilir?
Muhammed Gelbana

35

Yaptığınız tüm değişiklikleri güncelleyin:

git add -u

Silinen dosyalar işaretlenmemiş (genellikle kırmızı renk) ile aşamalı (yeşil) arasında değişmelidir. Ardından silinen dosyaları kaldırmayı taahhüt edin:

git commit -m "note"

1
Popülist rozeti hak ediyor.
John

1
Bu açık ara en iyi çözümdür. Hiçbir komut dosyası kesmek, uzun bir süreç yok, sadece git dizinini iyice güncellemek için bir bayrak.
Ron Dahlgren

Parlak! Beni 20+ dosya yolu yazmak zorunda kalmadan kurtardı. Teşekkürler!
allardbrain

12

Değiştirilmiş dosyaları hazırlama konusunda umursamıyorsanız en iyi çözüm mshameers ve / veya pb2qgit add -u tarafından söylendiği gibi kullanmaktır .

Silinen dosyaları kaldırmak istiyorsanız, ancak değiştirilmiş olanları sahne almazsanız, ls-filesargümanı--deleted seçenekle (regex veya diğer karmaşık argümanlar / seçenekler kullanmanıza gerek yok):

git ls-files --deleted | xargs git rm

1
git add -ABu sorunu çözer ... herhangi birinin gelecekte bilmek istediği durumlarda. aşağıdaki yanıtı kontrol edin
Ja8zyjits

8

Evet, git rm <filename>bir dosyanın silinmiş durumunu <filename>bir glob kalıbı oluşturabilecek şekilde yerleştirir:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

Sonra, taahhüt edebilirsiniz.

git commit -a İsterseniz bunu tek seferde yapacağız.

Ayrıca git add -u, silinen tüm dosyalar da dahil olmak üzere tüm değişiklikleri sahneye koymak ve ardından işlem yapmak için kullanabilirsiniz.


yani rm. (tam durak) onları bir kerede silmek mi?
Shin

sadece git rm hepsini bir kerede kaldıracak mı?
Shin

1
Birden fazla dosyayı kaldırmak için glob tarzı bir desen kullanabilirsiniz; Cevabımı bir örnek göstermek için güncelledim.
Ben James

5
Görünüşe git add -ugöre tam olarak aradığımız şey - eğer çok sayıda silme yaparsanız, o zaman en kolay ve en 'standart' yol gibi görünen tüm silme işlemlerini gerçekleştirmek istiyorsanız (yani, duruma özel globs veya karmaşık kabuk ayrıştırması olmadan) xargs). Tüm değişiklikleri bir kerede eklemesi dışında bunu kullanmak istemememizin bir nedeni var mı?
trisweb

7

Sildiğim ve taahhütte bulunmayan çok sayıda dosyam olduğunda hepsini git rmtek bir şovda yapabilirsiniz :

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

Soru cevaplayıcısının belirttiği gibi, dikkatli olun git rm.



3

Kullanabilirsiniz

git commit -m "remove files" -a
git push

Dosyaları elle sildikten sonra.


1
Ya da aynı ama daha özlü: git commit -am "dosyaları kaldır"
BradChesney79

3

Çalıştırıldığında tüm dosyalarınızı kaldıracak bir kabuk komut dosyası oluşturabilirsiniz:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

Oluşturulan komut dosyasıdır remove.shve git rmkomutların tam listesini içerir .


2
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf


2

Hepsini "git rm" kullanarak silmek istiyorsanız. Bu benim işim:

git ls-files --deleted -z | xargs -0 git rm

Bu sorgu kaldırılmış tüm dosyaları listeler ve git deponuzdan siler. Umarım yardımcı olur.



1

Onları sildikten ve bu düzgün komutla karşılaştıktan sonra depomda görünen hayalet dosyaları sorunu vardı!

git add -A

Temelde git add -ave git add -ukombine aynıdır , ancak büyük / küçük harfe duyarlıdır. Bu harika bağlantıdan aldım (bu bağlantı şu anda archive.org'daki sürüme işaret ediyor, çünkü orijinal Haziran 2016 itibarıyla bir spam / kimlik avı sayfasına dönüştü)


0

Silinen dosyaları nasıl tespit edeceğiniz ve bir sonraki işlemin bir parçası olarak silme işlemlerini nasıl aşamalandıracağınız aşağıda açıklanmıştır. Bu iplikteki tüm çözümlerin farklı değerleri vardır. Bu çözüm, özellikle içinde boşluk bulunan dosya adları sorunuyla ilgilenmektedir.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

aşağıdakilerle çalıştırmadan önce bunu git - kuru çalışma seçeneği ile test ettiğinizden emin olun:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

açıklama:

git status --porcelain

Bu, yalnızca yol adlarında boşluk olduğunda gerçekleşen D "/ bir klasör yolu / bir dosya yolu" gibi bir şey yazdırır.

awk '/^.D .*$/ {print $0}'

yalnızca "D" ile başlayan satırlarla eşleşir

sed 's/ D \(.*\)/\1/'

"D" yi her dizenin önünden kaldır

tr -d '"'

varsa tırnak işaretlerini kaldır

xargs -I {} git rm '{}'

boşluklu dosya adlarını desteklediğinden emin olmak için dosya adı değişkenlerini {} tek tırnak içine alınmış git rm altında dosya adını çalıştır olarak tanımlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.