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

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

1190
задан Codebeef 29 янв. '09 в 20:18
источник поделиться
28 ответов

Для Git 1.x

$ git add -u

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

Для Git 2.0

Чтобы скомпоновать все дерево работы:

$ git add -u :/

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

$ git add -u .
2172
ответ дан carl 10 сент. '09 в 3:13
источник поделиться
git ls-files --deleted -z | xargs -0 git rm 

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

1325
ответ дан Varinder 28 февр. '11 в 23:21
источник поделиться

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

git add -u

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

git commit -m "Deleted files manually"
718
ответ дан Cody Caughlan 29 янв. '09 в 20:25
источник поделиться

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

git add -u

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

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

git commit -a

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

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

git ls-files --deleted -z | xargs -0 git rm
git commit
351
ответ дан Emil Sit 10 сент. '09 в 3:15
источник поделиться

Возможно, вы ищете -A:

git add -A

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

161
ответ дан Dustin 29 янв. '09 в 21:10
источник поделиться

Чтобы создать только удаленные файлы:

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

Или (путь xargs):

git status | awk '/deleted/ {print $3}' | xargs git rm

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

90
ответ дан Saeb Amini 26 нояб. '11 в 13:34
источник поделиться
git rm test.txt

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

56
ответ дан Peaker 10 сент. '09 в 3:13
источник поделиться

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

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

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

45
ответ дан zobie 31 янв. '09 в 7:50
источник поделиться

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

git add -u 

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

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

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

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

35
ответ дан Stephan Tual 09 апр. '12 в 14:24
источник поделиться

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

git commit -a

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

26
ответ дан SpoonMeiser 29 янв. '09 в 20:29
источник поделиться
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.
17
ответ дан Sijo Kurian 01 окт. '12 в 22:36
источник поделиться

git add -u

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

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

13
ответ дан Obay 26 авг. '14 в 15:24
источник поделиться

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

git rm $(git ls-files --deleted)
11
ответ дан Houssem Bdr 06 нояб. '15 в 16:32
источник поделиться

Если вы хотите добавить его в свой .gitconfig, выполните следующие действия:

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

Затем все, что вам нужно сделать, запускается:

git rma
8
ответ дан Evan Moran 25 июля '12 в 23:47
источник поделиться
git ls-files --deleted -z | xargs -0 git rm --cached

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

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

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

6
ответ дан Murphy Danger 04 янв. '14 в 23:34
источник поделиться

Попробуйте.

-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"
4
ответ дан ilgam 09 марта '15 в 18:05
источник поделиться

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

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

git ls-files --deleted -z | xargs -t -0 git rm
4
ответ дан Venkateswara Rao 17 апр. '16 в 18:00
источник поделиться

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

Отработка ответа Джереми, вот что я получил:

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

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

3
ответ дан Xiong Chiamiov 26 июля '09 в 2:41
источник поделиться

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

git add -u

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

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

git reset HEAD <path>

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

3
ответ дан DarkNeuron 21 февр. '12 в 21:43
источник поделиться

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

git ls-files --deleted | xargs git rm

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

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

3
ответ дан l3x 24 мая '13 в 16:45
источник поделиться

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

И после "смены стадии" я сделал "commit"...

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

2
ответ дан Serdar 15 нояб. '11 в 17:29
источник поделиться
git commit -m 'commit msg' $(git ls-files --deleted)

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

2
ответ дан Chad 05 авг. '14 в 17:40
источник поделиться

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

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

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

1
ответ дан thomasrutter 07 марта '13 в 4:29
источник поделиться

(Еще одно изменение)

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

git ls-files --deleted  | grep <folder-name> | xargs git rm
0
ответ дан urban 23 нояб. '16 в 13:32
источник поделиться

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

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

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

0
ответ дан Sawyer 04 февр. '14 в 18:34
источник поделиться

что-то вроде

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

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

0
ответ дан Jeremy French 29 янв. '09 в 20:28
источник поделиться

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

0
ответ дан Haris Krajina 19 февр. '14 в 15:16
источник поделиться

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

git cola

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

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

-2
ответ дан Broes De Cat 03 окт. '12 в 17:28
источник поделиться

Другие вопросы по меткам