Удаление нескольких файлов из репозитория 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-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
- Получить статус файлов.
- Для удаленных файлов изолируйте имя файла.
- Удалите все строки, начинающиеся с #, а также строку состояния, в которой было слово "удалено"; Я точно не помню, что это было, и его там больше нет, поэтому вам, возможно, придется изменить это для разных ситуаций. Я думаю, что группировка выражений может быть специфической особенностью GNU, поэтому, если вы не используете gnutils, вам, возможно, придется добавить несколько
grep -v
линий. - Передать файлы
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