Usuwanie wielu plików z repozytorium Git, które zostały już usunięte z dysku

1311

Mam repozytorium Git, z którego usunąłem cztery pliki rm( nie git rm ), a mój status Git wygląda następująco:

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

Jak usunąć te pliki z Git bez konieczności ręcznego przechodzenia i dodawania każdego pliku w ten sposób:

git rm file1 file2 file3 file4

Idealnie szukam czegoś, co działa w ten sam sposób git add ., jeśli to możliwe.

Codebeef
źródło
10
@seth, nie zawsze jest wygodny w użyciu git rm, usunięcie mogło być z oddzielnego narzędzia, IDE lub menedżera plików. Visual Studio dla jednego może być uciążliwe podczas usuwania / zmiany nazw plików.
Brett Ryan,
67
Ugh, pytanie, dlaczego ktoś nie używa, git rmprzypomina trochę pytanie, dlaczego nie używa git vimlub git cd. To głupia rzecz do zrobienia, a git powinien mieć wbudowane polecenie lub alias do usuwania usuniętych plików ze środowiska przemieszczania, i nie powinieneś szukać go na SO ani czytać stron podręcznika podczas przerwy na lunch.
WCWedin
7
Odpowiedź Varindera nie jest dobrym sposobem. Zastanów się nad git add -u, jak sugerował Cody, i która jest również odpowiedzią na to pytanie: stackoverflow.com/questions/1402776/…
Roland

Odpowiedzi:

2300

Dla Git 1.x

$ git add -u

Mówi to gitowi, aby automatycznie przeprowadzał etapy śledzenia plików - w tym usuwanie wcześniej śledzonych plików.

Dla Git 2.0

Aby wystawić całe działające drzewo:

$ git add -u :/

Aby ustawić tylko bieżącą ścieżkę:

$ git add -u .
carl
źródło
133
Pamiętaj, że spowoduje to dodanie wszystkich zmienionych, śledzonych plików - usuniętych i zaktualizowanych.
Ian Hunter,
19
@ Beanland, musisz podać tylko ścieżkę do określonego pliku, który chcesz zmodyfikować, jeśli nie chcesz, aby wszystkie otrzymały. np. git add -u [ścieżka]
Paul Prewett
27
również, git add -u folder/aby uruchomić tę operację w folderze
c ..
2
Do Twojej wiadomości: ta odpowiedź została scalona ze stackoverflow.com/questions/1402776/…
Shog9,
1
Może to być pytanie, które ludzie zadawali, kiedy dotarli na tę stronę, i może to być to, co OP chciał w rzeczywistości zadać, ale to nie odpowiada dokładnie na zadane pytanie.
Relequestual
1362
git ls-files --deleted -z | xargs -0 git rm 

może być tym, czego szukasz ... to działa dla mnie ..

Varinder
źródło
5
w systemie Windows spróbuj dodać następujący alias do konfiguracji bez cudzysłowu, jak podano powyżej przez Evana Morana 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS
21
uważaj
44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy
15
git add -u, jak sugerował Cody, jest znacznie prostszym i bezpieczniejszym sposobem, bez ryzyka przypadkowego usunięcia plików.
Roland
4
Głosowanie w dół, ponieważ jest to zła odpowiedź, nawet jeśli może działać w przypadku niektórych plików. użyj „git add -u” poniżej. Po to jest.
n13
733

Możesz użyć

git add -u

Aby dodać usunięte pliki do obszaru przejściowego, a następnie zatwierdz je

git commit -m "Deleted files manually"
Cody Caughlan
źródło
100
Uwaga: użytkownik Google: dodaje zmodyfikowane śledzone pliki również do obszaru przejściowego.
erenon
4
Uruchom to polecenie tylko wtedy, gdy pliki zostały właśnie usunięte i chcesz je natychmiast wprowadzić na scenę.
Aryo,
1
nie jestem w stanie usunąć pliku z repozytorium bitbucket]
srinivas gowda
356

Jeśli po prostu uruchomisz:

git add -u

git zaktualizuje swój indeks, aby wiedzieć, że usunięte pliki powinny faktycznie być częścią następnego zatwierdzenia. Następnie możesz uruchomić polecenie „git commit”, aby sprawdzić tę zmianę.

Lub jeśli uruchomisz:

git commit -a

Automatycznie weźmie te zmiany (i wszelkie inne) i zatwierdzi je.

Aktualizacja : jeśli chcesz tylko usunąć usunięte pliki, spróbuj:

git ls-files --deleted -z | xargs -0 git rm
git commit
Emil Sit
źródło
1
Racja, git commit -azrobię to, co chcę, z wyjątkiem niektórych przypadków, że mam pliki, których nie chcę zatwierdzać, więc chcę przygotować zatwierdzenie ręcznie.
Igor Zevaka,
2
commit -a zasadniczo robi najpierw „add -u”; zaktualizuje indeks o wszelkie zmiany w znanych plikach (czy to usunięcie, czy zwykłe zmiany). Możesz oczywiście być bardziej szczegółowy i dodawać / rm tylko te pliki, które chcesz. git.or.cz/gitwiki/… może być pomocny.
Emil Sit
2
Zestaw poleceń pod „Aktualizacja: ..” działał jak urok. Dzięki!
Jay Taylor,
10
Dziękuję bardzo za 'git ls-files --deleted | xargs git rm!
mit
18
„git ls-files --deleted | xargs git rm” to poprawna odpowiedź! Dzięki!
reto
166

Prawdopodobnie szukasz -A:

git add -A

jest to podobne do git add -u, ale dodaje także nowe pliki. Jest to mniej więcej odpowiednik addremovepolecenia hg (chociaż wykrywanie ruchu odbywa się automatycznie).

Dustin
źródło
8
Krótka uwaga: użycie -u ogranicza dodawanie do śledzonych plików, a -a obejmie również nieśledzone pliki. Pomyślałem, że zwrócę uwagę na różnicę.
spaaarky21
Na tym etapie możesz równie dobrze dodać wszystko poprzez flagę commit -a.
Zac Grierson
94

Aby ustawić tylko usunięte pliki:

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

Lub (sposób xargs):

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

Możesz ustawić swój preferowany zestaw aliasów w celu późniejszego wygodnego użycia.

Saeb Amini
źródło
2
@ Saeb Zrozumieć kolejkę, ale xargsopanowanie zajmuje około 15 minut.
Eric Wilson,
11
git status | awk '/deleted/ {print $3}' | xargs git rmbyłby to krótszy sposób. grep | awk... Po prostu powiedz nie.
Mark Reed,
58
git rm $(git ls-files --deleted)nie jest to wygodniejsze (skopiowane z tego ).
Hotschke
1
xargs lub powyższe podstawienie $ (), jeśli wiesz, że lista nie jest duża. Jeśli lista jest ogromna: git ls-files --deleted | while read f; do git rm $f; done
Andrew
2
@Andrew xargsjest prawdopodobnie bardziej wydajna niż pętla while dla ogromnej listy, ponieważ za każdym razem przekazuje więcej niż jeden argument git rm. Aby ograniczyć liczbę argumentów przekazywanych do git rmkażdego wykonania, użyj -nopcji:git ls-files --deleted | xargs -n 15 git rm
Ajedi32,
61
git rm test.txt

Przed lub po usunięciu rzeczywistego pliku.

Szczyt
źródło
7
Chociaż to działa, często usuwam mnóstwo plików rmi żałuję później.
carl
4
Dlaczego jest to gorsze niż robienie git add -u? Wydaje się, że bezpieczniej byłoby dodać określone pliki, które zostały usunięte do zatwierdzenia, niż dodawać WSZYSTKIE zmiany.
Ian Dunn
2
tak naprawdę powinna to być najlepsza odpowiedź zgodnie z ostatnim wierszem pytania „Chcę tylko polecenia, które usuwa wszystkie pliki z git, które są również usuwane z dysku”.
Ramsharan
2
@Ramsharan nie, ponieważ wcale tego nie robi. Spowoduje to usunięcie jednego pliku; OP w szczególności zażądał „wszystkich” usuniętych plików.
Adam
1
@Ramsharan nie, o to chodzi - w prawie wszystkich przypadkach NIE MOŻESZ po prostu użyć symboli wieloznacznych (nie ma pasujących symboli wieloznacznych). Dlatego główna odpowiedź jest o wiele bardziej skomplikowana.
Adam
49

Używając git-add z opcjami „--all” lub „--update” możesz uzyskać więcej, niż chciałeś. Nowe i / lub zmodyfikowane pliki zostaną również dodane do indeksu. Mam konfigurację aliasu bash, gdy chcę usunąć usunięte pliki z git bez dotykania innych plików:

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

Wszystkie pliki, które zostały usunięte z systemu plików, są dodawane do indeksu jako usunięte.

zobie
źródło
39

To nie ma znaczenia, ale nie zgadzam się z wybraną odpowiedzią:

git add -u 

... usunie pliki z indeksu, jeśli odpowiednie pliki w drzewie roboczym zostały usunięte, ale także przygotuje zmodyfikowaną nową zawartość śledzonych plików.

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

... z drugiej strony będą zapisywać tylko usunięte pliki, które były śledzone.

Moim zdaniem ta druga opcja jest lepszą opcją.

Stephan Tual
źródło
29

Jeśli to jedyne zmiany, możesz po prostu to zrobić

git commit -a

zatwierdzić wszystkie zmiany. Obejmuje to usunięte pliki.

SpoonMeiser
źródło
3
Nie jestem pewien, dlaczego zostałem odrzucony; git wykonuje dobrą robotę, identyfikując pliki, które zostały usunięte, nawet jeśli nie powiedziałeś tego wprost za pomocą git rm.
SpoonMeiser
Zostałeś zagłosowany, ponieważ „-a” nie jest akceptowalnym przełącznikiem, to „-A”. Edycja odpowiedzi.
Sheharyar
10
Nie, „-a” jest akceptowalnym przełącznikiem, ponieważ polecenie jest zatwierdzone . „-A” to przełącznik służący do dodawania, ale nie zatwierdzania . Widzę, że Twoja sugerowana edycja została już odrzucona.
SpoonMeiser
W przypadku, gdy jedyne, co popełniasz, to usunięty plik, dodaj przełącznik --allow-empty
billrichards
err, właściwie --allow-empty jest potrzebne tylko wtedy, gdy zrobiłeś git rm --cached
billrichards
20
git ls-files --deleted | xargs git rm 

jest najlepszą opcją dodawania tylko usuniętych plików.

Oto kilka innych opcji.

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
źródło
16

git add -u

-u --update Dopasowuje tylko do już śledzonych plików w indeksie, a nie do drzewa roboczego. Oznacza to, że nigdy nie będzie wystawiał nowych plików, ale będzie wystawiał zmodyfikowaną nową zawartość śledzonych plików i usunie pliki z indeksu, jeśli odpowiednie pliki z drzewa roboczego zostaną usunięte.

Jeśli nie, nie, domyślnie „.”; innymi słowy, zaktualizuj wszystkie śledzone pliki w bieżącym katalogu i jego podkatalogach.

Obay
źródło
Najlepiej głosowana odpowiedź mówi już o użyciu git add -u. Skąd biorą się wszystkie inne elementy twojej odpowiedzi, dokumentacja? Powinieneś połączyć się z dokumentacją i cytować ją, jeśli tak jest.
TheWarriorNamedFoo
14

To proste rozwiązanie działa dla mnie dobrze:

git rm $(git ls-files --deleted)
Houssem Badri
źródło
Myślę, że zawsze powinieneś używać git shell na swoim bieżącym katalogu roboczym
Houssem Badri,
2
Jest to przyjemne i proste, ale nie działa z folderami rekurencyjnymi.
DrB,
@BehnazChangizi Myślę, że tak, stackoverflow.com/questions/1054044/…
Houssem Badri
@PvdL nieakceptowane spacje na ścieżce to problem specyficzny dla systemu operacyjnego
Houssem Badri
11

Jeśli chcesz to dodać, .gitconfigzrób to:

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

Następnie wystarczy uruchomić:

git rma
Evan Moran
źródło
1
oraz z linii cmdgit 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

Spowoduje to usunięcie wszystkich usuniętych plików, które były wcześniej śledzone przez git, a także zajmie się przypadkiem, w którym w nazwach plików znajdują się spacje.

W zależności od wariantu POSIX może być konieczne użycie xargs -0 -r: spowoduje toxargs to płynne zamknięcie, gdy potokowana zawartość będzie pusta.

EDYCJA: --cachedi --deletedflagi są używane w tandemie, aby zabezpieczyć się przed przypadkowym usunięciem plików, które nie zostały jeszcze usunięte.

Murphy Danger
źródło
7

Powiedz tej komendzie, aby automatycznie ustawiała pliki, które zostały zmodyfikowane i usunięte, ale nie dotyczy to nowych plików, o których nie powiedziałeś Gitowi:

-a -
wszyscy

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

lub

git add --all && git commit -m "Your commit"
ilgam
źródło
1
git add --all && git commit -m "Your commit" To działało dla mnie w Windows-7, używając powłoki poleceń Git bash.
kmarabet
1
Następujące polecenie działało dla mnie w systemie Windows-7 przy użyciu powłoki poleceń Git bash: $ git add --all && git commit -m „usuń pliki właściwości” [master 58c41ac] usuń pliki właściwości 1 zmieniony plik, 9 usunięć (-). .. Następnie w celu wypchnięcia zatwierdzonych zmian do zdalnego repozytorium uruchomiono: $ git push origin .. Zliczanie obiektów: 10, gotowe.
kmarabet
6

Następujące elementy będą działać, nawet jeśli masz wiele plików do przetworzenia:

git ls-files --deleted | xargs git rm

Prawdopodobnie będziesz również chciał zatwierdzić komentarz.

Aby uzyskać szczegółowe informacje, zobacz: Przydatne skrypty Git

l3x
źródło
6

Proszę użyć -t aby zobaczyć, które polecenie jest faktycznie uruchamiane

Właśnie poprawiłem odpowiedź Virender, aby zrobić to samo:

git ls-files --deleted -z | xargs -t -0 git rm
Venkateswara Rao
źródło
5

Żadna z flag, które należy dodać do git-add, nie wystawi tylko usuniętych plików; jeśli wszystko, co zmodyfikowałeś, to usunięte pliki, wszystko w porządku, ale w przeciwnym razie musisz uruchomić git-status i przeanalizować dane wyjściowe.

Na podstawie odpowiedzi Jeremy'ego otrzymałem:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Uzyskaj status plików.
  2. W przypadku usuniętych plików wyizoluj nazwę pliku.
  3. Usuń wszystkie linie zaczynające się od #, a także linię stanu, w której było słowo „usunięte”; Nie pamiętam dokładnie, co to było i już go nie ma, więc być może będziesz musiał to zmodyfikować dla różnych sytuacji. Myślę, że grupowanie wyrażeń może być cechą specyficzną dla GNU, więc jeśli nie używasz gnutils, może być konieczne dodanie wielu grep -vwierszy.
  4. Przekaż pliki do git rm.

Umieszczenie tego w aliasie powłoki teraz ...

Xiong Chiamiov
źródło
5

Jak wspomniano

git add -u

etapy usuwa pliki do usunięcia, ALE TAKŻE zmodyfikował pliki do aktualizacji.

Aby cofnąć scenę ze zmodyfikowanych plików, możesz to zrobić

git reset HEAD <path>

jeśli chcesz utrzymać swoje porządki i porządek.
UWAGA: Mogłoby to również spowodować usunięcie usuniętych plików, więc uważaj na te symbole wieloznaczne.

DarkNeuron
źródło
4
git commit -m 'commit msg' $(git ls-files --deleted)

To działało dla mnie po tym, jak już usunąłem pliki.

Czad
źródło
3

Potrzebowałem tego samego i użyłem przycisku „zmiana sceny” git gui. dodaje również wszystko.

A po „zmianie sceny” dokonałem „zatwierdzenia” ...

więc mój katalog roboczy jest ponownie czysty.

Serdar
źródło
Cóż, używanie GUI to CHEATING, lol! Ale szybciej w przypadkach, gdy projektant GUI zaspokoił twoje potrzeby. Dobrze jest wiedzieć, jak majstrować przy „tym, co jest pod maską”.
Dennis,
1
Do Twojej wiadomości: ta odpowiedź została scalona ze stackoverflow.com/questions/1402776/…
Shog9,
3
git rm $(git ls-files -d)

Usuwa wszystkie pliki wymienione w git ls-filespoleceniu (-d pokazuje tylko usunięte pliki). Nie działa w przypadku plików ze spacjami w nazwie pliku lub ścieżce, ale jest łatwy do zapamiętania

A. Albershteyn
źródło
2

Możesz użyć git add -u <filenames> do ustawienia tylko usuniętych plików.

Na przykład, jeśli usunąłeś pliki templates/*.tpl, użyjgit add -u templates/*.tpl .

Jest -uto wymagane w celu odniesienia do plików, które istnieją w repozytorium, ale nie istnieją już w katalogu roboczym. W przeciwnym razie domyślnie git addjest szukanie plików w katalogu roboczym, a jeśli określisz pliki, które tam usunąłeś, nie będzie ich znaleźć.

thomasrutter
źródło
2

Dodanie aliasu systemowego do przemieszczania usuniętych plików jako polecenia rm-all

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

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

Uwaga

Windows musi być bashzainstalowany.

Haris Krajina
źródło
2

(Jeszcze inna odmiana)

Chciałem usunąć wszystkie już usunięte z plików na dysku, ale z jednego określonego folderu, pozostawiając pozostałe foldery nietknięte. Dla mnie działało:

git ls-files --deleted  | grep <folder-name> | xargs git rm
miejski
źródło
1

coś jak

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

może to zrobić.

Jeremy French
źródło
2019 wersja git 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841 30.0919
1

Dla projektu studia wizualnego

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

co jest przydatne, gdy ścieżka do usuniętego pliku ma miejsce

Tracz
źródło
-1

Najbardziej elastycznym rozwiązaniem, jakie do tej pory znalazłem, jest

git cola

I wybierz wszystkie usunięte pliki, które chcę wystawić.

(Uwaga: Zazwyczaj wszystko robię z linii poleceń w git, ale git radzi sobie z nieco usuniętymi plikami).

Broes De Cat
źródło
Symbole wieloznaczne nie działały dla mnie, git add -u path/to/my/deleted-files-pattern-*.ymlwięc była to dla mnie najlepsza odpowiedź (nie chcąc wystawiać wszystkich usuniętych plików, ale 50 na kilkaset).
mlncn