Staging Usunięte pliki

499

Powiedzmy, że mam plik w moim repozytorium git o nazwie foo.

Załóżmy, że został usunięty za pomocą rm(nie git rm). Następnie status git pokaże:

Changes not staged for commit:

    deleted: foo

Jak przeprowadzić etap usuwania tego pojedynczego pliku?

Jeśli spróbuję:

git add foo

To mówi:

'foo' did not match any files.
Andrew Tomazos
źródło
2
Czy był to problem w starych wersjach Gita? Obecnie nie wydaje się, że jest jednym, działa podobnie do zmodyfikowanych plików.
cst1992,

Odpowiedzi:

22

Począwszy od Gita 2.0.0, git addbędzie także przeprowadzać usuwanie plików.

Dokumenty Git 2.0.0 - git-add

<pathspec>…

Pliki do dodania treści. Fileglobs (np. * .C) można podać, aby dodać wszystkie> pasujące pliki. Można również podać wiodącą nazwę katalogu (np. Katalog, aby dodać katalog / plik1 i katalog / plik2), aby zaktualizować indeks, aby pasował do bieżącego stanu katalogu jako całości (np. Określenie katalogu spowoduje zapisanie nie tylko zmodyfikowanego pliku katalog / plik1) w drzewie roboczym plik dir / file2 został dodany do drzewa roboczego, ale także plik dir / file3 usunięty z drzewa roboczego. Pamiętaj, że starsze wersje Git ignorowały usunięte pliki; użyj opcji --no-all, jeśli chcesz dodać zmodyfikowane lub nowe pliki, ale zignoruj ​​usunięte.

peflorencio
źródło
Przyjęta odpowiedź nie rozwiązuje problemu - a inne są bardziej kłopotliwe od Git 2.0.0 - to najlepszy sposób! Masz moje poparcie
João Antunes,
518

Służy git rm foodo ustawiania pliku do usunięcia. (Spowoduje to również usunięcie pliku z systemu plików, jeśli nie został wcześniej usunięty. Można go oczywiście przywrócić z git, ponieważ był wcześniej zalogowany.)

Aby przygotować plik do usunięcia bez usuwania go z systemu plików, użyj git rm --cached foo

Wooble
źródło
8
Możesz także dodać --cacheflagę, aby usunąć plik tylko z repozytorium i pozostawić nietykalny w systemie plików.
Hauleth,
Jaki byłby proces cofnięcia tej operacji, to znaczy wycofanie pliku do usunięcia? Czy to jest możliwe?
longda
82
Właściwie OP zapytał, jak przygotować plik już_deleted i można to zrobić przez git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". Wydaje się, że inne odpowiedzi pokazują, jak poprawnie usuwać pliki (ale nie jak usuwać już usunięte pliki). ps. xargspolecenia oparte działa na mnie na Ubuntu 12.04, jednak kiedy ręcznie zrobić git add -u deleted_file.txtdoens't pracy. Mój git to 1.7.9.5
Dimitry K
8
@DimitryK: git rmz przyjemnością przygotuje plik do usunięcia, nawet jeśli został już usunięty z systemu plików. I jak zauważa komentarz OP do innej odpowiedzi, chcieli stworzyć jeden konkretny plik, który został już usunięty.
Wooble,
3
git rmnie wystawia już usuniętych plików. Zgłasza ten błąd: fatal: pathspec '~.SLDASM' did not match any files. Oto ekrany z dowodem: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . Pierwszy zrzut ekranu wyraźnie pokazuje, że 2 pliki są usuwane i nie są przenoszone, drugi zrzut ekranu pokazuje, że kiedy piszę git rm "~$Box.SLDASM", generuje ten błąd.
KulaGGin
413

Mimo że jest poprawny w użyciu git rm [FILE], możesz to zrobić git add -u.

Zgodnie z git-adddokumentacją:

-u --aktualizacja

Zaktualizuj indeks dokładnie tam, gdzie ma już wpis pasujący do [PLIK]. To usuwa, a także modyfikuje wpisy indeksu, aby pasowały do ​​drzewa roboczego, ale nie dodaje nowych plików.

Jeśli nie podano opcji [PLIK], gdy użyto opcji -u, wszystkie śledzone pliki w całym drzewie roboczym są aktualizowane (stare wersje Git służyły do ​​ograniczania aktualizacji do bieżącego katalogu i jego podkatalogów).

Po czym indeks zostanie odświeżony, a pliki będą odpowiednio ustawione.

Sailesh
źródło
56
Tak git add -A ., dodam wszystkie zmiany, szczególnie chciałem wprowadzić jeden usunięty plik.
Andrew Tomazos,
25
Spowoduje to dodanie wszystkich zmodyfikowanych plików; Nie tylko usunięte pliki.
Forever,
3
To jest poprawne. Mówiąc dokładniej, wprowadzi wszystkie zmiany w plikach, które są już śledzone, zarówno usunięte, jak i zmodyfikowane. Pomaga to, gdy usuwasz wiele plików i nie chcesz ustawiać ich oddzielnie.
Sailesh
9
Czy istnieje sposób na stopniowe usuwanie usuniętych plików i ich modyfikowanie? Po prostu ciekawy.
sierpień
11
Zrobiłem git add -u FolderWithDeletedFiles/i zrobiłem, co chcę, dzięki
parlament
158

Aby ustawić wszystkie ręcznie usunięte pliki, możesz użyć:

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

Aby dodać alias do tego polecenia jako git rm-deleted, uruchom:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Ian Mackinnon
źródło
2
notacja $ () najwyraźniej nie istnieje w konsoli bash systemu Windows, co prowadzi dounknown option `deleted)
Félix Gagnon-Grenier
2
Nie sądzę, żeby to działało, jeśli masz spacje na swojej drodze. Przynajmniej nie działa w moim systemie (z zsh).
Wil Shipley,
3
Działa dla mnie idealnie! Zrobiłem dokładnie to, czego potrzebowałem. Ogromne uznanie tutaj!
RedSands,
W for /F %I in ('git ls-files --deleted') do git add -u %I
systemie
3
nie działa to w przypadku nazw plików ze spacjami, w razie potrzeby „git add -u”.
J-Dizzle,
33

aby dodać wszystkie gotowe usunięte pliki

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all

dziękuję sprawdź, aby się upewnić

git status

Powinieneś być gotowy do drogi

Chet Corey
źródło
5
Potwierdzenie, że to działa. Myślę, że lekcją tutaj jest nie robić rm <file>, ale raczejgit rm <file>
DanGordon,
1
FYI: wycinanie spacji powoduje problemy, jeśli na ścieżkach są spacje
David
1
nie działa to w przypadku nazw plików ze spacjami, w razie potrzeby „git add -u”.
J-Dizzle,
Działa dla mnie idealnie git version 2.15.2 (Apple Git-101.1).
Kalob Taulien
działa idealnie na konsoli linux!
Ahmed AMMOURI
8

Możesz użyć

git rm -r --cached -- "path/to/directory"

na scenie usuniętego katalogu.

GameScripting
źródło
8

Możesz użyć tego polecenia

git add  `git ls-files --deleted`
gnana jeyam95
źródło
0

dla osób używających git 2.x + w PowerShell:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
orion elenzil
źródło