Как удалить несколько удаленных файлов в репозитории 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 собирает Аргументы и предоставляет их в . Это работает для любого количества файлов, независимо от сходства (или несходства) в именах.


другая версия ответа 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.

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

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 }'`; do git rm $i; done

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


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

 git rm `git ls-files -d`

можно использовать

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

после удаления файлов вручную.


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

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

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


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

git add -u .

git add --update .

Если вы хотите удалить все из них с помощью "git rm". Вот что я делаю:--2-->

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

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


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

git clean -fd

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

git add -A

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


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

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

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

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

объяснение:

git status --porcelain

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

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

матч только строки, которые начинаются с "D"

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

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

tr -d '"'

удалить кавычки, если таковые имеются

xargs -I {} git rm '{}'

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