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

28 1237

28 ответов:

Для 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, но также добавляет новые файлы. Это примерно эквивалентно hg addremove команда (хотя обнаружение движения автоматическая).

на сцене только удалены файлы:

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

или (путь xargs):

git status | awk '/deleted/ {print }' | 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)

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

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

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

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

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

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

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 для изящного выхода при конвейерном содержании null.

EDIT:--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 ls-files --deleted | xargs git rm

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

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

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

git add -u

этапы удаленные файлы для удаления, но и измененные файлы для обновления.

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

git reset HEAD <path>

Если вы хотите, чтобы ваши коммиты были организованы и чисты.
Примечание: это может также unstage удаленные файлы, так что будьте осторожны с этими подстановочными знаками.

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

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

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

и после того, как" этап изменился "я сделал" commit"...

Так что мой рабочий каталог чист.

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

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

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

для проекта visual studio

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

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

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

git cola

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

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