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




git удалить файл из индекса (19)

У меня есть Git repo, что я удалил четыре файла с помощью rm ( not 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  | grep <folder-name> | xargs git rm

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

git add -A

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


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

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

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


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

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

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

git commit -a

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

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

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

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

git commit -a

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


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

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

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


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

И после «смены стадии» я сделал «фиксацию» ...

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


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

git cola

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

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


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

Работая с ответом Джереми, это то, что я получил:

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

Придерживая это в псевдониме оболочки теперь ...


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

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

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

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

git ls-files --deleted | xargs git rm

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

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


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

git add -u

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

git commit -m "Deleted files manually"

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

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

что-то вроде

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

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


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

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


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

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

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

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


git rm test.txt

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





git-rm