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

StackOverflow https://stackoverflow.com/questions/492558

Вопрос

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

Это было полезно?

Решение

Для 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 добавить - u

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

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

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

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

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

Попробуй это.

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

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

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

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

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

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

git add -u

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

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

git reset HEAD <path>

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

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

git ls-files --deleted | xargs git rm

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

Для получения подробной информации смотрите: Полезные Git - Скрипты

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

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

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

И после того, как "этап изменен", я сделал "фиксацию" ...

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

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

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

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

что - то вроде

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

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

Добавление системного псевдонима для размещения удаленных файлов в качестве команды 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 rm $(git ls-files -d)

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

Для проекта Visual Studio

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

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

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

git cola

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top