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


1311

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



10
@seth, это не всегда удобно использовать git rm, удаление могло быть из отдельного инструмента, IDE или файлового менеджера. Visual Studio для одного может быть проблемой при удалении / переименовании файлов.
Бретт Райан

67
Тьфу, спрашивать, почему кто-то не использует, git rmнемного похоже на вопрос, почему они не используют git vimили git cd. Это глупо, и в git должна быть встроенная команда или псевдоним для удаления удаленных файлов из промежуточного уровня, и вам не нужно искать его на SO или читать справочные страницы на обеденном перерыве.
WCWedin

7
Ответ Вариндера не очень хороший способ. Рассмотрим git add -u, как предложил Коди, и который также является ответом на этот вопрос: stackoverflow.com/questions/1402776/…
Roland

Ответы:


2300

Для Git 1.x

$ git add -u

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

Для Git 2.0

Чтобы подготовить все ваше рабочее дерево:

$ git add -u :/

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

$ git add -u .

133
Обратите внимание, что это добавит все измененные, отслеженные файлы - удаленные и обновленные.
Ян Хантер

19
@beanland, вам нужно только указать путь к конкретному файлу, который вы хотите изменить, если вы не хотите, чтобы он получил их все. например, git add -u [путь]
Пол Преуетт

27
также git add -u folder/запустить эту операцию в папке
с ..

2
FYI: этот ответ слиты из stackoverflow.com/questions/1402776/...
Shog9

1
Это может быть вопрос, который люди задавали, когда они пришли на эту страницу, и это может быть тем, что на самом деле хотел задать ОП, но он не отвечает на точный вопрос.
Relequestual

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

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


5
для окон попробуйте добавить следующий псевдоним в вашу конфигурацию без кавычек, как указано выше Эваном Мораном 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS


44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Макс Нанаси

15
git add -u, как предположил Коди, гораздо проще и безопаснее, без риска случайного удаления файлов.
Роланд

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

733

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

git add -u

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

git commit -m "Deleted files manually"

101
Обратите внимание на пользователя Google: он также добавляет измененные отслеживаемые файлы в область подготовки.
Эренон

4
Запускайте эту команду, только если вы только что удалили файлы и хотите сразу их разместить.
Арье

1
я не могу удалить файл из репозитория Bitbucket]
srinivas gowda

356

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

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/… может быть полезным.
Эмиль Сит

2
Набор команд под «Update: ..» работал как шарм. Спасибо!
Джей Тейлор

10
Большое спасибо за 'git ls-files --deleted | xargs git rm '!
Мит

18
"git ls-files --deleted | xargs git rm" - правильный ответ! Спасибо!
13

166

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

git add -A

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


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

На этом этапе вы также можете добавить все с помощью флага commit -a.
Зак Гриерсон

94

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

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... Просто скажи нет.
Марк Рид

58
git rm $(git ls-files --deleted)Разве это не удобнее (скопировано с этого ).
Хотчке

1
xargs или указанная выше подстановка $ (), если вы знаете, список невелик. Если список является огромным: git ls-files --deleted | while read f; do git rm $f; done
Andrew

2
@Andrew xargs, вероятно, более эффективен, чем цикл while для огромного списка, поскольку он передает более одного аргумента при каждом выполнении git rm. Чтобы ограничить количество аргументов, передаваемых при git rmкаждом его выполнении, используйте -nпараметр:git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

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


7
Хотя это будет работать, я часто удаляю тонну файлов, просто rmсожалею об этом позже.
Карл

4
Почему это хуже, чем делать git add -u? Кажется, что было бы безопаснее добавить определенные файлы, которые были удалены в коммит, а не добавлять ВСЕ изменения.
Ян Данн

2
на самом деле это должен быть лучший ответ в соответствии с последней строкой вопроса: «Я просто хочу команду, которая удаляет все файлы из git, которые также удаляются с диска».
Рамшар

2
@ Рамшаран нет, потому что он этого не делает вообще. Это удаляет один файл; ОП ОСОБЕННО запросил «все» удаленные файлы.
Адам

1
@ Ramsharan нет, в этом суть - почти во всех случаях вы НЕ МОЖЕТЕ просто использовать подстановочный знак (нет подстановочного знака, который будет соответствовать). Вот почему основной ответ намного сложнее.
Адам

49

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

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

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


39

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

git add -u 

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

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

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

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


29

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

git commit -a

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


3
Не уверен, почему я получил отрицательный голос; git хорошо идентифицирует удаленные файлы, даже если вы не указали этого явно с помощью git rm.
SpoonMeiser

Вы получили отрицательный голос, потому что "-a" не является приемлемым переключателем, это "-A". Редактирование вашего ответа.
Шехарьяр

10
Нет, «-a» - это допустимый ключ, потому что команда это commit . «-A» - это переключатель, который нужно добавить, но не зафиксировать . Я вижу, что предложенное вами изменение уже отклонено.
SpoonMeiser

Если единственное, что вы делаете, это удаленный файл, добавьте переключатель --allow-empty
billrichards

э-э-э, на самом деле --allow-empty требуется, только если вы сделали git rm --cached
billrichards

20
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.

16

git add -u

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

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


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

14

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

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

Я думаю, что вы всегда должны использовать git shell в
своем

2
Это красиво и просто, но не работает с рекурсивными папками.
DrB

@BehnazChangizi Я думаю, что так и есть, stackoverflow.com/questions/1054044/…
Хусем Бадри

@PvdL не допускаются пробелы в пути - это проблема,
связанная с

11

Если вы хотите добавить это к себе, .gitconfigсделайте это:

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

Тогда все, что вам нужно сделать, это запустить:

git rma

1
и из линии CMDgit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Кейси

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

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

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

РЕДАКТИРОВАТЬ: --cachedи --deletedфлаги используются в тандеме для защиты от случайного удаления файлов, которые еще не были удалены.


7

Скажите команде автоматически создавать файлы, которые были изменены и удалены, но новые файлы, о которых вы не сообщили Git, не будут затронуты:

-a
--all

git add . && git commit -m -a "Your commit"

или

git add --all && git commit -m "Your commit"

1
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, сделано.
Кмарабет

6

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

git ls-files --deleted | xargs git rm

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

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


6

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

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

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

5

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

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

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

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


5

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

git add -u

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

Для удаления измененных файлов вы можете сделать

git reset HEAD <path>

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


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

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


3

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

И после того, как "сцена изменилась", я сделал "совершить" ...

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


Хорошо с помощью графического интерфейса обманывает, смеется! Но быстрее в тех случаях, когда дизайнер GUI покрывал ваши потребности. Полезно знать, как повозиться с «что под капотом».
Деннис

1
FYI: этот ответ слиты из stackoverflow.com/questions/1402776/...
Shog9

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

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


2

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

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

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


2

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


2

(Еще один вариант)

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

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


1

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

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

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


-1

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

git cola

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

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


Подстановочные знаки не работали для меня, git add -u path/to/my/deleted-files-pattern-*.ymlтак что это был лучший ответ для меня (не желая размещать все удаленные файлы, но 50 из пары сотен).
mlncn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.