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

1246

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

  • 2
    связанные: stackoverflow.com/questions/1856654/…
  • 10
    @seth, не всегда удобно использовать git rm , удаление могло быть из отдельного инструмента, IDE или файлового менеджера. Visual Studio для одного может быть проблемой при удалении / переименовании файлов.
Показать ещё 3 комментария
Теги:
git-commit
git-add
git-rm

29 ответов

2121
Лучший ответ

Для Git 1.x

$ git add -u

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

Для Git 2.0

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

$ git add -u :/

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

$ git add -u .
  • 125
    Обратите внимание, что это добавит все измененные, отслеженные файлы - удаленные и обновленные.
  • 19
    @beanland, вам нужно только указать путь к конкретному файлу, который вы хотите изменить, если вы не хотите, чтобы он получил их все. например, git add -u [путь]
Показать ещё 8 комментариев
1273
git ls-files --deleted -z | xargs -0 git rm 

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

  • 35
    Обратите внимание, что этот ответ не будет работать в Windows: /
  • 4
    для окон попробуйте добавить следующий псевдоним в вашу конфигурацию без кавычек, как указано выше Эваном Мораном 'remove =! git ls-files --deleted -z | xargs -0 git rm '
Показать ещё 20 комментариев
762

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

git add -u

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

git commit -m "Deleted files manually"
  • 98
    Обратите внимание на пользователя Google: он также добавляет измененные отслеживаемые файлы в область подготовки.
  • 4
    Запускайте эту команду только в том случае, если вы только что удалили файлы и хотите сразу их разместить.
Показать ещё 1 комментарий
371

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

git add -u

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

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

git commit -a

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

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

git ls-files --deleted -z | xargs -0 git rm
git commit
  • 1
    Хорошо, git commit -a будет делать то, что я хочу, за исключением некоторых случаев, когда у меня есть файлы, которые я не хочу фиксировать, поэтому я хочу подготовить коммит вручную.
  • 2
    commit -a по существу сначала делает "add -u"; он будет обновлять индекс с любыми изменениями в известных файлах (будь то удаления или простые изменения). Конечно, вы можете быть более конкретным и добавлять / rm только те файлы, которые вам нужны. git.or.cz/gitwiki/… может быть полезным.
Показать ещё 7 комментариев
155

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

git add -A

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

  • 8
    Вкратце, использование -u ограничивает добавление к отслеживаемым файлам, а -a также включает неотслеживаемые файлы. Просто подумал, что укажу на разницу.
  • 0
    На этом этапе вы можете также добавить все с помощью флага commit -a.
92

Чтобы подготовить только удаленные файлы:

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

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

  • 2
    @Saeb Понимаю про очередь, но xargs можно за 15 минут.
  • 11
    git status | awk '/deleted/ {print $3}' | xargs git rm будет более коротким способом сделать это. grep | awk ... просто скажи нет
Показать ещё 8 комментариев
63
git rm test.txt

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

  • 7
    Хотя это будет работать, я часто удаляю тонну файлов через rm и сожалею об этом позже.
  • 0
    Это меньшее решение, чем принято
Показать ещё 9 комментариев
50

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

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

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

38

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

git add -u 

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

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

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

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

27

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

git commit -a

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

  • 3
    Не уверен, почему я получил отрицательный голос; git хорошо идентифицирует удаленные файлы, даже если вы не указали этого явно с помощью git rm.
  • 0
    Вы получили отрицательный голос, потому что "-a" не является приемлемым переключателем, это "-A". Редактирование вашего ответа.
Показать ещё 4 комментария
19
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.
15

git add -u

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

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

  • 0
    В самом верхнем ответе уже сказано, что нужно использовать git add -u . Откуда все остальные вещи в вашем ответе, документация? Вы должны сослаться на документацию и сделать кавычки, если это так.
14

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

git rm $(git ls-files --deleted)
  • 0
    Это не работает, если на пути есть пробелы
  • 0
    Я думаю, что вы всегда должны использовать Git Shell на текущий рабочий каталог
Показать ещё 3 комментария
10

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

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

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

git rma
  • 1
    и из строки cmd git config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
8
git ls-files --deleted -z | xargs -0 git rm --cached

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

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

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

6

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

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

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

Попробуйте.

-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"
  • 0
    git add --all && git commit -m "Your commit" Это сработало для меня в windows-7, используя командную оболочку Git bash.
  • 1
    Следующая команда работала у меня в windows-7 с использованием командной оболочки Git bash: $ git add --all && git commit -m "удалить файлы свойств" [master 58c41ac] удалить файлы свойств 1 файл изменен, 9 удалений (-). .. Затем, чтобы отправить эти зафиксированные изменения в удаленный репозиторий, выполните: $ git push origin .. Подсчет объектов: 10, сделано.
5

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

git ls-files --deleted | xargs git rm

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

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

5

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

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

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

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

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

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

4

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

git add -u

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

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

git reset HEAD <path>

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

3

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

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

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

  • 0
    Хорошо с помощью графического интерфейса обманывает, смеется! Но быстрее в тех случаях, когда дизайнер GUI покрывал ваши потребности. Полезно знать, как повозиться с «что под капотом».
  • 1
    К вашему сведению: этот ответ объединен со stackoverflow.com/questions/1402776/…
2

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

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

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

1

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

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

git ls-files --deleted  | grep <folder-name> | xargs git rm
1

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

1

что-то вроде

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

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

0
git rm $(git ls-files -d)

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

0

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

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

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

-2

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

git cola

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

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

  • 1
    что такое git cola ?
  • 2
    GUI для git ( git-cola.github.io ).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню