Diskten önceden silinmiş bir Git deposundan birden çok dosyayı kaldırma


1311

Dört dosyayı kullanarak rm( değil git rm ) sildiğim bir Git repo var ve Git durumum şöyle:

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

El ile geçip böyle her dosyayı eklemek zorunda kalmadan bu dosyaları Git'ten nasıl kaldırabilirim:

git rm file1 file2 file3 file4

İdeal olarak, git add .eğer mümkünse aynı şekilde çalışan bir şey arıyorum .



10
@seth, kullanımı her zaman uygun değildir git rm, kaldırma işlemi ayrı bir araç, IDE veya dosya yöneticisinden yapılmış olabilir. Birisi için Visual Studio dosyaları kaldırırken / yeniden adlandırırken bir acı olabilir.
Brett Ryan

67
Ahh, birisi yapar soran neden olmasın kullanım git rmonlar kullanmayın neden sormak gibi biraz git vimya git cd. Yapmanız gereken aptalca bir şey ve git, silinmiş dosyaları sahnelemeden kaldırmak için yerleşik bir komut veya takma ada sahip olmalı ve bunu SO'ya bakmanız veya öğle tatilinizde man sayfalarını okumalısınız.
WCWedin

7
Varinder'ın cevabı iyi bir yol değil. Cody'nin önerdiği gibi git add -u düşünün ve bu sorunun da cevabı budur: stackoverflow.com/questions/1402776/…
Roland

Yanıtlar:


2300

Git 1.x için

$ git add -u

Bu, git'e daha önce izlenen dosyaları silmek de dahil olmak üzere izlenen dosyaları otomatik olarak sahne almasını söyler.

Git 2.0 için

Tüm çalışan ağacınızı sahneye koymak için:

$ git add -u :/

Yalnızca geçerli yolu düzenlemek için:

$ git add -u .

133
Bunun tüm değiştirilmiş, izlenen dosyaları sileceğini ve güncellendiğini unutmayın.
Ian Hunter

19
@beanland, yalnızca tümünü almak istemiyorsanız değiştirmek istediğiniz dosyanın yolunu sağlamanız gerekir. örneğin git add -u [yol]
Paul Prewett

27
Ayrıca git add -u folder/bu işlemi bir klasörde çalıştırmak için
c ..


1
İnsanların bu sayfaya geldiklerinde sordukları soru olabilir ve OP'nin aslında sormak istediği şey bu olabilir, ancak sorulan tam soruya cevap vermez.
Relequestual

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

aradığınız şey olabilir .. benim için çalışıyor ..


5
Windows için Evan Moran tarafından yukarıda belirtilen tırnak işaretleri olmadan aşağıdaki takma ad eklemeyi deneyin 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS

21
adında boşluk bulunan dosyalara karşı dikkatli olun
maazza

44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy

15
git add -u Cody'nin önerdiği gibi çok daha basit ve güvenli bir yöntemdir, yanlışlıkla dosya silme riski yoktur.
Roland

4
Bazı dosyalar için çalışsa bile yanlış cevap olduğu için bunu küçümsemek. aşağıdaki "git add -u" kullanın. Bunun için.
n13

733

Kullanabilirsiniz

git add -u

Silinen dosyaları hazırlama alanına eklemek için,

git commit -m "Deleted files manually"

100
Lütfen Google kullanıcısına dikkat edin: Değiştirilen izlenen dosyaları hazırlama alanına da ekler.
erenon

4
Bu komutu yalnızca dosyaları yeni çıkardıysanız ve hemen yerleştirmek istiyorsanız çalıştırın.
Aryo

1
bitbucket repo dosya kaldırmak mümkün değil]
srinivas gowda

356

Sadece koşarsanız:

git add -u

git, sildiğiniz dosyaların bir sonraki işlemin parçası olması gerektiğini bilmek için dizinini güncelleyecektir. Sonra bu değişikliği kontrol etmek için "git commit" çalıştırabilirsiniz.

Veya koşarsanız:

git commit -a

Bu değişiklikleri (ve diğerlerini) otomatik olarak alacak ve taahhüt edecektir.

Güncelleme : Yalnızca silinen dosyaları eklemek istiyorsanız şunu deneyin:

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

1
Doğru, git commit -aistediğim şeyi yapacağım, ancak bazı durumlarda yürütmek istemediğim dosyalar var, bu yüzden taahhüdü manuel olarak hazırlamak istiyorum.
Igor Zevaka

2
taahhüt -a temelde bir "add -u" yapar; dizini bilinen dosyalarda yapılan herhangi bir değişiklikle güncelleyecektir (silme veya basit değişiklik yapma gibi). Elbette daha spesifik olabilir ve sadece istediğiniz dosyaları ekleyebilirsiniz. git.or.cz/gitwiki/… yardımcı olabilir.
Emil Sit

2
"Güncelleme: .." altındaki komut takımı bir cazibe gibi çalıştı. Teşekkürler!
Jay Taylor

10
'Git ls-files --deleted için çok teşekkür ederim | xargs git rm '!
mit

18
"git ls-files --deleted | xargs git rm" doğru cevaptır! Teşekkürler!
reto

166

Muhtemelen -A'yı arıyorsunuz:

git add -A

bu git add -u işlevine benzer, ancak yeni dosyalar da ekler. Bu, kabaca hg addremovekomutunun eşdeğeridir (hareket algılama otomatik olmasına rağmen).


8
Hızlı bir yan notta, -u kullanmak izlenen dosyalara eklenmeyi sınırlar ve -a izlenmemiş dosyaları da içerir. Sadece farkı işaret edeceğimi düşündüm.
spaaarky21

Bu aşamada, - a bayrağını da ekleyebilirsiniz.
Zac Grierson

94

Sahneye sadece silinmiş dosyalar:

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

Veya (xargs yolu):

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

Daha sonra kullanmak üzere tercih ettiğiniz komut kümesini diğer adınıza ekleyebilirsiniz .


2
@Saeb Sırayı anlayın, ancak xargsustalaşması yaklaşık 15 dakikadır.
Eric Wilson

11
git status | awk '/deleted/ {print $3}' | xargs git rmbunu yapmanın daha kısa bir yolu olurdu. grep | awk... Sadece Hayır Deyin
Mark Reed

58
git rm $(git ls-files --deleted)(kopyalanan bu daha uygun değil bu ).
Mart'ta Hotschke

1
listenin çok büyük olmadığını biliyorsanız, xargs veya yukarıdaki $ () ikamesi. Liste çok büyükse : git ls-files --deleted | while read f; do git rm $f; done
Andrew

2
@ Andrew xargs , büyük bir liste için bir while döngüsünden muhtemelen daha verimlidir, çünkü her yürütüldüğünde birden fazla argüman geçirir git rm. git rmHer yürütüldüğünde iletilen bağımsız değişken sayısını sınırlamak için şu -nseçeneği kullanın:git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

Gerçek dosyayı silmeden önce veya sonra.


7
İşe yarayacak olsa da, sık sık kendimi bir ton dosyayı silip rmdaha sonra pişman oluyorum .
carl

4
Bu neden yapmaktan daha kötü git add -u? TÜM değişiklikleri eklemek yerine, silinen belirli dosyaları eklemek daha güvenli gibi görünüyor .
Ian Dunn

2
aslında bu sorunun son satırına göre en iyi cevap olmalıdır "Ben sadece diskten de silinmiş git tüm dosyaları silen bir komut istiyorum."
Ramsharan

2
@ Ramsharan hayır, çünkü bunu hiç yapmıyor. Bu, tek bir dosyayı siler; OP özellikle "tüm" silinen dosyaları istedi.
Adam

1
@Ramsharan hayır, mesele bu - neredeyse tüm durumlarda sadece bir joker karakter kullanamazsınız (eşleşecek joker karakter yoktur). Bu yüzden ana cevap çok daha karmaşık.
Adam

49

Git-add komutunu '--all' veya '--update' seçenekleriyle kullanarak istediğinizden daha fazlasını alabilirsiniz. Yeni ve / veya değiştirilmiş dosyalar da dizine eklenir. Başka dosyalara dokunmadan git'den silinen dosyaları kaldırmak istediğimde bash diğer adı kurulumum var:

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

Dosya sisteminden kaldırılan tüm dosyalar dizine silindi olarak eklenir.


39

Gerçekten önemli olduğu için değil, ama seçilen cevaba katılmıyorum:

git add -u 

... çalışma ağacındaki ilgili dosyalar kaldırılmışsa dosyaları dizinden kaldıracaktır, ancak izlenen dosyaların değiştirilmiş yeni içeriklerini de aşamalandıracaktır.

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

... öte yandan sadece izlenen silinen dosyaları rm.

Benim görüşüme göre daha iyi bir seçenek.


29

Tek değişiklik bunlarsa,

git commit -a

tüm değişiklikleri yapmak. Bu silinen dosyaları içerecektir.


3
Neden aşağı oy kullandığımdan emin değilim; git, git rm komutunu kullanarak açıkça söylememiş olsanız bile, silinmiş dosyaları tanımlamada iyi bir iş çıkarır.
SpoonMeiser

"-A" kabul edilebilir bir anahtar değil, "-A" olduğu için oy kullandınız. Cevabınızı düzenleme.
Sheharyar

10
Hayır, "-a" olduğu komut olduğu için kabul edilebilir bir anahtarı, taahhüt . "-A" için bir geçiş olduğunu eklemek değil işlemek . Önerilen düzenlemenizin zaten reddedildiğini görüyorum.
SpoonMeiser

Taahhüt ettiğiniz tek şeyin silinmiş dosya olması durumunda --allow-empty
billrichards

err, aslında --allow-empty sadece git rm --cached
billrichards

20
git ls-files --deleted | xargs git rm 

yalnızca silinen dosyaları eklemek için en iyi seçenektir.

İşte diğer bazı seçenekler.

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 --update Yalnızca çalışma ağacı yerine dizinde zaten izlenen dosyalarla eşleşir. Bu, hiçbir zaman yeni dosyaları yerleştirmeyeceği, ancak izlenen dosyaların değiştirilmiş yeni içeriklerini sahne alacağı ve çalışma ağacındaki ilgili dosyalar kaldırılmışsa dosyaları dizinden kaldıracağı anlamına gelir.

Hayır verilirse, varsayılan olarak "."; diğer bir deyişle, geçerli dizindeki ve alt dizinlerindeki tüm izlenen dosyaları güncelleyin.


En çok oy alan cevap zaten kullanılıyor diyor git add -u. Cevabınızdaki diğer tüm bilgiler nereden geliyor, belgeler? Belgelere bağlantı vermeli ve eğer varsa blok alıntı yapmalısınız.
TheWarriorNamedFoo


11

Eğer eklemek istiyorsanız bunu yapın .gitconfig:

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

O zaman tek yapmanız gereken koşmak:

git rma

1
ve cmd hattındangit 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

Bu, daha önce git tarafından izlenen tüm silinen dosyaları kaldıracak ve dosya adlarınızın içinde boşluk olduğu durumu ele alacaktır.

POSIX varyantınıza bağlı olarak, kullanmanız gerekebilir xargs -0 -r: bu,xargs boş içerik taşlandığında nazikçe çıkmanıza .

DÜZENLE: --cachedve --deletedbayraklar, daha önce silinmemiş dosyaları yanlışlıkla silmeye karşı korumak için birlikte kullanılır.


7

Komuta, değiştirilmiş ve silinmiş dosyaları otomatik olarak yerleştirmesini söyleyin, ancak Git'e söylemediğiniz yeni dosyalar etkilenmez:

-a
--tüm

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

veya

git add --all && git commit -m "Your commit"

1
git add --all && git commit -m "Taahhüdünüz" Bu benim için Git bash komut kabuğunu kullanarak windows-7'de çalıştı.
kmarabet

1
Aşağıdaki komut Git-bash komut kabuğunu kullanarak windows-7'de benim için çalıştı: $ git add --all && git commit -m "özellik dosyalarını kaldır" [master 58c41ac] özellik dosyalarını kaldır 1 dosya değişti, 9 silme (-). .. Sonra uzak depoda bu taahhüt değişiklikleri itmek için çalıştırın: $ git push origin .. Nesneleri sayma: 10, bitti.
kmarabet

6

İşlenecek çok sayıda dosyanız olsa bile aşağıdakiler işe yarar:

git ls-files --deleted | xargs git rm

Muhtemelen bir yorum yapmak isteyeceksiniz.

Ayrıntılar için, bkz. Yararlı Git Komut Dosyaları


6

-tHangi komutun gerçekten çalıştırıldığını görmek için lütfen kullanın

Virender'ın cevabını aynı şeyi yaptım:

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

5

Git-add işaretlerinin hiçbiri yalnızca kaldırılan dosyaları aşamaz; tüm değiştirdiğiniz dosyalar silinmişse, sorun yoktur, ancak aksi halde git-status çalıştırmanız ve çıktıyı ayrıştırmanız gerekir.

Jeremy'nin cevabı üzerinde çalıştığımda, aldığım şey bu:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Dosyaların durumunu alın.
  2. Silinen dosyalar için dosyanın adını ayırın.
  3. #S ile başlayan tüm satırları ve içinde "silinmiş" kelimesinin bulunduğu bir durum satırını kaldırın; Tam olarak ne olduğunu hatırlamıyorum ve artık orada değil, bu yüzden bunu farklı durumlar için değiştirmeniz gerekebilir. Bence ifadelerin gruplandırılması GNU'ya özgü bir özellik olabilir, bu nedenle gnutil kullanmıyorsanız birden fazla grep -vsatır eklemeniz gerekebilir .
  4. Dosyaları şuraya aktarın git rm.

Bunu şimdi bir kabuk takma adına yapıştırarak ...


5

Söylendiği gibi

git add -u

kaldırılan dosyaları silinmek üzere ayarlar, AMA AYRICA güncelleme için değiştirilmiş dosyalar.

Değiştirilmiş dosyaları kaldırmak için şunları yapabilirsiniz

git reset HEAD <path>

taahhütlerinizi düzenli ve temiz tutmak istiyorsanız.
NOT: Bu, silinen dosyaları da bozabilir, bu joker karakterlere çok dikkat eder.


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

Dosyaları zaten sildikten sonra bu benim için çalıştı.


3

Aynı ve git gui "sahne değişti" düğmesine ihtiyacım vardı. aynı zamanda hepsini ekler.

Ve "sahne değiştikten" sonra "taahhütte bulundum" ...

çalışma dizinim tekrar temiz.


Bir gui kullanmak CHEATING, lol! Ancak GUI tasarımcısının ihtiyaçlarınızı karşıladığı durumlarda daha hızlı. 'Kaputun altında ne var' ile nasıl uğraşacağını bilmek iyidir.
Dennis


3
git rm $(git ls-files -d)

git ls-filesKomut tarafından listelenen tüm dosyaları kaldırır (-d yalnızca silinen dosyaları gösterir). Dosya adında veya yolda boşlukları olan dosyalar için çalışmaz, ancak hatırlaması basit


2

Yalnızca git add -u <filenames>silinen dosyaları yerleştirmek için kullanabilirsiniz.

Örneğin, dosyaları sildiyseniz templates/*.tplkullanın git add -u templates/*.tpl.

-uDepoda ancak çalışma dizinde artık dosyalara başvurmak için gereklidir. Aksi takdirde, varsayılan değeri git addçalışma dizinindeki dosyaları aramaktır ve orada sildiğiniz dosyaları belirtirseniz, dosyaları bulamaz.


2

Silinen dosyaları komut olarak hazırlamak için sistem takma adı ekleme rm-all

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

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

Not

Windows'un bashyüklü olması gerekir.


2

(Yine başka bir varyasyon)

Önceden silinmiş olan tüm disk dosyalarından, ancak belirli bir klasörden silmek, diğer klasörlere dokunmak istemedim. Aşağıdakiler benim için çalıştı:

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


1

Görsel stüdyo projesi için

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

silinen dosya yolunda boşluk olduğunda kullanışlıdır


-1

Bugüne kadar bulduğum en esnek çözüm

git cola

Ve sahne almak istediğim tüm silinen dosyaları seçin.

(Not Genellikle git komut satırında her şeyi yaparım, ama git kaldırılan dosyaları biraz garip işler).


Joker karakterler benim için çalışmıyordu, git add -u path/to/my/deleted-files-pattern-*.ymlbu yüzden bu benim için en iyi cevaptı (silinen tüm dosyaları sahnelemek istemiyordu, ancak birkaç yüzden 50'si).
mlncn
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.