Постановка удаленных файлов

499

Скажем, у меня есть файл в моем репозитории git foo.

Предположим, что он был удален с rm(не git rm). Тогда git status покажет:

Changes not staged for commit:

    deleted: foo

Как подготовить удаление этого файла?

Если я попробую:

git add foo

Это говорит:

'foo' did not match any files.
Андрей Томазос
источник
2
Была ли это проблема в старых версиях Git? В настоящее время он не похож на один, он работает аналогично измененным файлам.
cst1992

Ответы:

22

Начиная с Git 2.0.0, git addтакже будет происходить удаление файлов.

Git 2.0.0 Docs - git-add

<pathspec>…

Файлы для добавления контента. Для добавления всех> подходящих файлов можно указать файловые блоки (например, * .c). Также может быть дано начальное имя каталога (например, dir для добавления dir / file1 и dir / file2) для обновления индекса в соответствии с текущим состоянием каталога в целом (например, указание dir будет записывать не только измененный файл dir / file1) в рабочем дереве файл dir / file2 добавляется в рабочее дерево, а также файл dir / file3, удаляемый из рабочего дерева. Обратите внимание, что более ранние версии Git использовали для игнорирования удаленных файлов, используйте параметр --no-all, если вы хотите добавить измененные или новые файлы, но игнорируйте удаленные.

peflorencio
источник
Принятый ответ не решает проблему - а другой более громоздкий, начиная с Git 2.0.0 - это лучший способ! У тебя есть мой голос
Жуан Антунес
519

Используйте git rm fooдля размещения файла для удаления. (Это также приведет к удалению файла из файловой системы, если он не был ранее удален. Конечно, его можно восстановить из git, поскольку он был ранее зарегистрирован.)

Чтобы подготовить файл для удаления, не удаляя его из файловой системы, используйте git rm --cached foo

Wooble
источник
8
Также вы можете добавить --cacheфлаг, чтобы удалить файл только из репозитория, и оставить нетронутым в файловой системе.
Хаулет
Каков будет процесс отмены этой операции, то есть удаления файла для удаления? Это возможно?
Longda
82
На самом деле OP спросил, как подготовить файлready_deleted, и это можно сделать git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". Другие ответы, кажется, показывают, как правильно организовать удаление файлов (но не как подготовить уже удаленные файлы). пс. команда xargsbased работает для меня в Ubuntu 12.04, однако, когда я делаю git add -u deleted_file.txtэто вручную, она не работает. Мой мерзавец 1.7.9.5
Димитрий К
8
@DimitryK: с git rmудовольствием создаст файл для удаления, даже если он уже был удален из файловой системы. И, как указывает комментарий ОП к другому ответу, они хотели подготовить один конкретный файл, который уже был удален.
Wooble
3
git rmне ставит уже удаленные файлы Он выдает эту ошибку: fatal: pathspec '~.SLDASM' did not match any files. Вот экраны с доказательством: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . Первый скриншот ясно показывает, что 2 файла удалены, а не подготовлены, второй скриншот показывает, что когда я печатаю git rm "~$Box.SLDASM", он выдает эту ошибку.
KulaGGin
413

Даже если это правильно использовать git rm [FILE], в качестве альтернативы, вы могли бы сделать git add -u.

Согласно git-addдокументации:

-u - обновить

Обновите индекс только там, где он уже имеет запись, соответствующую [FILE]. Это удаляет, а также изменяет записи индекса в соответствии с рабочим деревом, но не добавляет новых файлов.

Если [FILE] не задано при использовании опции -u, обновляются все отслеживаемые файлы во всем рабочем дереве (старые версии Git использовались для ограничения обновления текущим каталогом и его подкаталогами).

После чего индекс будет обновлен и файлы будут правильно размещены.

Sailesh
источник
56
Да git add -A .добавит все изменения, я специально хотел, чтобы один этап удалил файл.
Эндрю Томазос
25
Это добавит все измененные файлы; Не просто удаленные файлы.
навсегда
3
Это правильно. Точнее говоря, он будет отслеживать все изменения в файлах, которые уже отслежены, независимо от того, были ли они удалены или просто изменены. Это помогает, когда вы удаляете несколько файлов и не хотите ставить их отдельно.
Sailesh
9
Есть ли способ ставить только удаленные файлы, а не измененные? Просто любопытно.
августа
11
Я сделал, git add -u FolderWithDeletedFiles/и он сделал то, что я хочу, спасибо
парламент
158

Для проверки всех удаленных вручную файлов вы можете использовать:

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

Чтобы добавить псевдоним к этой команде как git rm-deleted, выполните:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Ян Маккиннон
источник
2
нотация $ (), по-видимому, не существует в консоли Windows bash, что приводит кunknown option `deleted)
Félix Gagnon-Grenier
2
Я не думаю, что это работает, если у вас есть пробелы на вашем пути, либо. По крайней мере, это не в моей системе (с Zsh).
Уил Шипли
3
Отлично сработало для меня! Сделал именно то, что мне было нужно. ОГРОМНАЯ благодарность здесь!
RedSands
В окнах сделатьfor /F %I in ('git ls-files --deleted') do git add -u %I
EIS
3
это не работает для имен файлов с пробелами, 'git add -u' делает, если необходимо.
J-Dizzle
33

Добавить все готовые удаленные файлы

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

спасибо проверить, чтобы убедиться

git status

тебе должно быть хорошо идти

Чет Кори
источник
5
Подтверждая, что это работает. Я думаю, что урок здесь состоит не в том, чтобы сделать rm <file>, а скорееgit rm <file>
DanGordon
1
FYI: резка на пространствах вызывает проблемы , если какие - либо пути имеют пробелы в них
Дэвисе
1
это не работает для имен файлов с пробелами, 'git add -u' делает, если необходимо.
J-Dizzle
Работает отлично для меня на git version 2.15.2 (Apple Git-101.1).
Калоб Таулиен
отлично работает на консоли Linux!
Ахмед АММУРИ
8

Ты можешь использовать

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

подготовить удаленный каталог.

GameScripting
источник
8

Вы можете использовать эту команду

git add  `git ls-files --deleted`
gnana jeyam95
источник
0

для тех, кто использует git 2.x + в powershell:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
Орион Элензил
источник