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


237

Я удалил некоторые файлы и показывает состояние 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


Ответы:


638
git add -u 

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


31
Работает шарм. Когда вы видите что-то вроде «git status | sed -n '/ ^ # * удалено: / s /// p' | xargs git rm» как предлагаемое решение для такого простого, но частого требования, тогда вы знаете, что лучшее решение - или скоро будет, за углом.
arcseldon

проще - лучше, это действительно удобно, чем «удар»
castiel

1
Автор спрашивает, как удалить файлы, почему добавление файлов является правильным ответом?
Келин

3
@kelin: из git docs ( git-scm.com/docs/git-add ): "-u --update Обновить индекс только там, где у него уже есть запись, соответствующая <pathspec>. Это удаляет, а также изменяет записи индекса в соответствует рабочему дереву, но не добавляет новых файлов. Если при использовании опции -u не задан <pathspec>, обновляются все отслеживаемые файлы во всем рабочем дереве (старые версии Git использовались для ограничения обновления текущим каталогом и его подкаталоги). "
Хедмон

92

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


6
Вы можете использовать подстановочные знаки (хотя вам может потребоваться их избежать), и git будет сопоставлять пути в индексе, а не только пути в рабочем дереве, поэтому не имеет значения, что они не существуют в файловой системе.
Бен Джеймс

109
git diff --diff-filter=D --name-only -z | xargs -0 git rmэто более надежный подход, чем попытка анализа, git statusориентированная на пользователя и не гарантирующая стабильности в будущих версиях.
CB Bailey

@Charles: это, конечно, лучше, но требует довольно много знаний о том, какие варианты доступны git diff(чего у меня не было, раньше у меня не было необходимости). Спасибо!
Джонатан Леффлер

8
Обратите внимание, что есть также "git ls-files --deleted"
Петр Гладких

1
так, git ls-files --deleted | xargs git rmсделал трюк для меня.
fiacobelli

50

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

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

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

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

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

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


2
Бесценно, что git ls-filesсо статусом удален или изменен так полезно
Марио Пешев

1
Поведение 'git add --update (or -u)'без аргумента пути из подкаталога дерева изменится в Git 2.0 и больше не должно использоваться. Чтобы добавить содержимое для всего дерева, выполните: git add --update :/ (или git add -u: /) Чтобы ограничить команду текущим каталогом, выполните: git add --update . (или git add -u.) В текущей версии Git команда ограничена командой текущий каталог
Ответ

1
Любая идея, как обрабатывать пути с пробелами в них? Пример: src/my spaced directory/myfile. Это может быть обработано индивидуально, но как это можно сделать, используя команды в этом ответе?
Мухаммед Гелбана

35

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

git add -u

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

git commit -m "note"

1
Заслуживает популистский значок.
Джон

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

Brilliant! Избавил меня от необходимости набирать более 20 путей к файлам. Спасибо!
allardbrain

12

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

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

git ls-files --deleted | xargs git rm

1
git add -Aрешает эту проблему ... на всякий случай, если кто-то захочет узнать в будущем. проверьте ответ ниже
Ja8zyjits

8

Да, 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 удалит все сразу?
Син

1
Вы можете использовать шаблон в стиле glob для удаления нескольких файлов; Я обновил свой ответ, чтобы показать пример.
Бен Джеймс

5
Кажется, git add -uэто именно то, что мы ищем - если вы делаете много удалений, то хотите зафиксировать все удаления, что представляется наиболее простым и наиболее «стандартным» способом (то есть без учета глобальных падежей и сложных разборов оболочки в xargs). Есть ли причина, по которой мы не хотим использовать это, кроме того факта, что он добавляет все изменения сразу?
trisweb

7

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

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

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



3

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

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

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


1
Или идентично, но более кратко: git commit -am "удалить файлы"
BradChesney79

3

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

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

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




2

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

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

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



1

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

git add -A

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


0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.