Удаление нескольких файлов из репозитория Git, которые уже были удалены с диска - PullRequest
1275 голосов
/ 29 января 2009

У меня есть репозиторий Git, в котором я удалил четыре файла с использованием rm ( не git rm), и мой статус Git выглядит следующим образом:

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

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

git rm file1 file2 file3 file4

В идеале я ищу что-то, что работает так же, как и git add ., если это возможно.

Ответы [ 29 ]

19 голосов
/ 01 октября 2012
git ls-files --deleted | xargs git rm 

- лучший вариант для добавления только удаленных файлов.

Вот еще несколько вариантов.

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.
15 голосов
/ 26 августа 2014

git add -u

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

Если значение не указано, по умолчанию используется значение "."; другими словами, обновите все отслеживаемые файлы в текущем каталоге и его подкаталогах.

14 голосов
/ 06 ноября 2015

Это простое решение прекрасно работает для меня:

git rm $(git ls-files --deleted)
10 голосов
/ 26 июля 2012

Если вы хотите добавить его в .gitconfig, сделайте следующее:

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

Тогда все, что вам нужно сделать, это запустить:

git rma
8 голосов
/ 05 января 2014
git ls-files --deleted -z | xargs -0 git rm --cached

Это удалит все удаленные файлы, которые были ранее отслежены git, а также обработает случай, когда в ваших именах файлов есть пробелы.

В зависимости от вашего варианта POSIX вам может понадобиться использовать xargs -0 -r: это приведет к изящному завершению xargs при передаче нулевого содержимого по трубопроводу.

EDIT: флаги --cached и --deleted используются в тандеме для защиты от случайного удаления файлов, которые еще не были удалены.

6 голосов
/ 17 апреля 2016

Пожалуйста, используйте -t, чтобы увидеть, какая команда на самом деле выполняется

Я только что подправил ответ Вирендера, чтобы сделать то же самое:

git ls-files --deleted -z | xargs -t -0 git rm
6 голосов
/ 09 марта 2015

Попробуй.

-a
--all
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.

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

или

git add --all && git commit -m "Your commit"
5 голосов
/ 26 июля 2009

Ни один из флагов git-add не ставит только удаленные файлы; если все, что вы изменили, это удаленные файлы, то все в порядке, но в противном случае вам нужно запустить git-status и проанализировать вывод.

Отработка ответа Джереми, вот что я получил:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Получить статус файлов.
  2. Для удаленных файлов изолируйте имя файла.
  3. Удалить все строки, которые начинаются с #, а также строку состояния, в которой было слово «удалено»; Я точно не помню, что это было, и его там больше нет, поэтому вам, возможно, придется изменить это для разных ситуаций. Я думаю, что группировка выражений может быть специфической особенностью GNU, поэтому, если вы не используете gnutils, вам может потребоваться добавить несколько grep -v строк.
  4. Передать файлы на git rm.

Вставить это в псевдоним оболочки ...

5 голосов
/ 24 мая 2013

Следующее будет работать, даже если у вас много файлов для обработки:

git ls-files --deleted | xargs git rm

Возможно, вы также захотите зафиксировать комментарий.

Подробнее см .: Полезные скрипты Git

5 голосов
/ 21 февраля 2012

Как уже упоминалось

git add -u

готовит удаленные файлы для удаления, НО ТАКЖЕ измененные файлы для обновления.

Для удаления измененных файлов вы можете сделать

git reset HEAD <path>

если вы хотите, чтобы ваши коммиты были организованными и чистыми.
ПРИМЕЧАНИЕ: Это также может привести к удалению файлов из памяти, поэтому будьте осторожны с этими подстановочными знаками.

...