Удаление нескольких файлов из репозитория Git, которые уже были удалены с диска

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

Ответ 1

Для Git 1.x

$ git add -u

Это означает, что Git автоматически выполняет отслеживание файлов, включая удаление ранее отслеженных файлов.

Для Git 2.0

Чтобы скомпоновать все дерево работы:

$ git add -u :/

Чтобы выполнить только текущий путь:

$ git add -u .

Ответ 2

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

может быть то, что вы ищете.. это работает для меня..

Ответ 3

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

git add -u

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

git commit -m "Deleted files manually"

Ответ 4

Если вы просто запустите:

git add -u

git обновит свой индекс, чтобы знать, что файлы, которые вы удалили, фактически должны быть частью следующего коммита. Затем вы можете запустить "git commit", чтобы проверить это изменение.

Или, если вы запустите:

git commit -a

Он автоматически примет эти изменения (и любые другие) и зафиксирует их.

Обновление. Если вы хотите только добавить удаленные файлы, попробуйте:

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

Ответ 5

Возможно, вы ищете -A:

git add -A

это похоже на git add -u, но также добавляет новые файлы. Это примерно эквивалентно команде hg addremove (хотя обнаружение перемещения происходит автоматически).

Ответ 6

Чтобы подготовить только удаленные файлы:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

Или (способ xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

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

Ответ 7

git rm test.txt

До или после удаления фактического файла.

Ответ 8

Используя git -add с параметрами '--all' или '--update', вы можете получить больше, чем вы хотели. Новые и/или измененные файлы также будут добавлены в индекс. У меня есть настройка bash alias, когда я хочу удалить удаленные файлы из git, не касаясь других файлов:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Все файлы, которые были удалены из файловой системы, добавляются в индекс как удаленные.

Ответ 9

Не то, чтобы это действительно имело значение, но я не согласен с выбранным ответом:

git add -u 

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

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

... с другой стороны будет только rm удаленных файлов, которые были отслежены.

Так что последнее, на мой взгляд, лучший вариант.

Ответ 10

Если это единственные изменения, вы можете просто сделать

git commit -a

чтобы зафиксировать все изменения. Это будет включать удаленные файлы.

Ответ 11

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.

Ответ 12

git add -u

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

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

Ответ 13

Это простое решение отлично подходит для меня:

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

Ответ 14

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

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

Затем все, что вам нужно сделать, запускается:

git rma

Ответ 15

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

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

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

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

Ответ 16

Попробуйте.

-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"

Ответ 17

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

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

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

Ответ 18

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

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

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

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

Ответ 19

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

git ls-files --deleted | xargs git rm

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

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

Ответ 20

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

git add -u

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

Чтобы отключить измененные файлы, вы можете сделать

git reset HEAD <path>

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

Ответ 21

git commit -m 'commit msg' $(git ls-files --deleted)

Это сработало для меня после того, как я уже удалил файлы.

Ответ 22

Мне нужно было то же самое и использовала кнопку git gui "changed changed". он также добавляет все.

И после "смены стадии" я сделал "commit"...

поэтому мой рабочий каталог снова очищается.

Ответ 23

Вы можете использовать git add -u <filenames> для размещения только удаленных файлов.

Например, если вы удалили файлы templates/*.tpl, используйте git add -u templates/*.tpl.

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

Ответ 24

что-то вроде

git status | sed -s "s/^.*deleted: //" | xargs git rm 

может это сделать.

Ответ 25

Добавление системного псевдонима для размещения удаленных файлов в виде команды rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

WINDOWS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Примечание

У Windows должен быть установлен bash.

Ответ 26

(Еще одно изменение)

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

git ls-files --deleted  | grep <folder-name> | xargs git rm

Ответ 27

Для проекта визуальной студии

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

который полезен, когда путь удаленного файла имеет пробел

Ответ 28

git rm $(git ls-files -d)

Удаляет все файлы, перечисленные командой git ls-files (-d показывает только удаленные файлы). Не работает для файлов с пробелами в имени файла или пути, но просто запомнить

Ответ 29

Наиболее гибким решением, которое я нашел на сегодняшний день, является

git cola

И выберите все удаленные файлы, которые я хочу выполнить.

(Примечание. Обычно я делаю все командную строку в git, но git обрабатывает удаленные файлы немного неудобно).