Как удалить несколько удаленных файлов в репозитории Git

Я удалил некоторые файлы и показывает состояние git, как показано ниже.

Я совершил и подтолкнул.

GitHub по-прежнему показывает удаленные файлы в хранилище. Как я могу удалить файлы в репозитории GitHub?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

Если я использую git rm, это дает следующее.

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched

16 ответов

Решение
git add -u 

обновляет все ваши изменения

Будьте очень осторожны с git rm .; это может удалить больше, чем вы хотите. Конечно, вы можете выздороветь, но проще не делать этого.

Простейшим было бы:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

Вы не можете использовать подстановочные знаки оболочки, потому что файлы не существуют, но вы можете использовать (по крайней мере, в Bash):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

Или подумайте:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

Это берет вывод git statusпо умолчанию ничего не печатает (sed -n), но в строках, которые начинаются # deleted:Избавляется от # и deleted: и печатает то, что осталось; xargs собирает аргументы и предоставляет их git rm команда. Это работает для любого количества файлов независимо от сходства (или различий) в именах.

Другая версия ответа ByScripts

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

Это только удалит удаленные файлы из GIT.

Это также может быть использовано для добавления ТОЛЬКО измененных файлов.

git add $(git ls-files --modified)

Эти команды также работают на gitbash для Windows.

Обновите все сделанные вами изменения:

git add -u

Удаленные файлы должны измениться с неустановленного (обычно красного цвета) на поэтапное (зеленого цвета). Затем подтвердите удаление удаленных файлов:

git commit -m "note"

Лучшее решение, если вы не заботитесь о размещении измененных файлов, это использовать git add -u как сказал mshameers и / или pb2q.

Если вы просто хотите удалить удаленные файлы, но не вносить какие-либо измененные, я думаю, вы должны использовать ls-files спор с --deleted опция (не нужно использовать регулярное выражение или другие сложные аргументы / опции):

git ls-files --deleted | xargs git rm

Да, git rm <filename> установит удаленное состояние файла, где <filename> может быть шаблоном шара:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

Затем вы можете совершить.

git commit -a сделаю это за один раз, если хочешь.

Вы также можете использовать git add -u внести все изменения, включая все удаленные файлы, затем зафиксировать.

Когда у меня есть много файлов, которые я удалил, которые не подготовлены для фиксации, вы можете git rm все они в одном шоу с:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

Как сказал ответчик, будьте осторожны с git rm,

Попробуй это:

 git rm `git ls-files -d`

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

git commit -m "remove files" -a
git push

После того, как вы удалили файлы вручную.

Если вы хотите удалить их все, используя "git rm". Вот что я делаю:

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

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

У меня была проблема с призрачными файлами, появляющимися в моем репо после того, как я удалил их и наткнулся на эту аккуратную команду!

git add -A

Это по сути так же, как git add -a а также git add -u в сочетании, но это чувствительно к регистру. Я получил его по этой замечательной ссылке (теперь эта ссылка указывает на версию на archive.org, поскольку по состоянию на июнь 2016 года оригинал преобразован в страницу со спамом и фишингом)

Вы можете создать сценарий оболочки, который удалит все ваши файлы при запуске:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

Сценарий, который создается remove.sh и он содержит полный список git rm команды.

git add -u .

git add --update .

Встроенная функция очистки также может быть полезна...

git clean -fd
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf

Вот как можно обнаружить удаленные файлы и выполнить их удаление как часть следующего коммита. Все решения в этой теме имеют разные достоинства. Это решение ниже конкретно касается проблемы имен файлов с пробелами в них.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

убедитесь, что вы проверили это с параметром git --dry-run, прежде чем запускать его с помощью следующего:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

объяснение:

git status --porcelain

Это печатает что-то вроде D "/ путь к папке / путь к файлу", что происходит только тогда, когда в именах путей есть пробелы

awk '/^.D .*$/ {print $0}'

сопоставлять только строки, начинающиеся с буквы " D "

sed 's/ D \(.*\)/\1/'

удалить " D " из передней части каждой строки

tr -d '"'

удалить цитаты, если есть

xargs -I {} git rm '{}'

определить переменные имени файла как {} запустить имя файла в git rm, заключенном в одинарные кавычки, чтобы убедиться, что он поддерживает имена файлов с пробелами.

Другие вопросы по тегам