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

У меня есть репозиторий 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 . делает, если это возможно.

32 ответа

Решение

Для Git 1.x

$ git add -u

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

Для Git 2.0

Чтобы подготовить все ваше рабочее дерево:

$ git add -u :/

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

$ git add -u .
git ls-files --deleted -z | xargs -0 git rm 

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

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

git add -u

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

git commit -m "Deleted files manually"

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

git add -u

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

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

git commit -a

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

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

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

Вы, вероятно, ищете -A:

git add -A

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

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

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

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

git rm test.txt

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

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

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

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

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

git add -u 

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

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

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

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

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

git commit -a

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

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.

git add -u

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

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

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

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

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

Если вы хотите добавить его в свой .gitconfig сделай это:

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

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

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

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

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

РЕДАКТИРОВАТЬ: --cached а также --deleted флаги используются в тандеме для защиты от случайного удаления файлов, которые еще не были удалены.

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

git add -u

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

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

git reset HEAD <path>

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

Попытайся.

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

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

git ls-files --deleted | xargs git rm

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

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

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

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

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

Ни один из флагов 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,

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

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

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

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

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

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

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

И после того, как "сцена изменилась", я сделал "совершить" ...

так что мой рабочий каталог снова чистый.

Добавление системного псевдонима для размещения удаленных файлов в качестве команды 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 установлены.

(Еще один вариант)

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

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

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

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

что полезно, когда в пути к удаленному файлу есть место

Удаление всех файлов, оканчивающихся на .log, из репо, но не из локального хранилища

git rm --cached $(git ls-files | grep "\.log$")

Что -то вроде

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

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

Просто

      git add . && git commit -m "the message for commit" && git push
Другие вопросы по тегам