Spec-Zone.ru › Git

git-rm

Название

git-rm — удаление файлов из рабочего дерева и индекса

Краткое описание

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
       [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]
       [--] [<pathspec>…​]

Описание

Удаляет файлы, соответствующие шаблону пути, из индекса или из рабочего дерева и индекса. git rm не удалит файл только из рабочего каталога. (Нет возможности удалить файл только из рабочего дерева, оставив его в индексе; для этого используйте /bin/rm.) Удаляемые файлы должны совпадать с состоянием вершины ветки, а изменения их содержимого не должны быть подготовлены в индексе, хотя это поведение по умолчанию можно изменить с помощью параметра -f. Если указан параметр --cached, подготовленное содержимое должно совпадать либо с состоянием вершины ветки, либо с файлом на диске, что позволяет удалить файл только из индекса. При использовании разреженных извлечений (см. git-sparse-checkout[1]) команда git rm удаляет только пути, соответствующие шаблонам разреженного извлечения.

Параметры

<pathspec>...

Файлы для удаления. Чтобы удалить все файлы в каталоге и рекурсивно во всех его подкаталогах, можно указать имя родительского каталога (например, dir для удаления dir/file1 и dir/file2), однако для этого необходимо явно указать параметр -r.

Команда удаляет только пути, известные Git.

Шаблоны файлов сопоставляются и за границами каталогов. Поэтому при наличии двух каталогов d и d2 использование git rm d*' отличается от использования git rm d/*', поскольку первый вариант также удалит весь каталог d2.

Дополнительные сведения см. в статье о <pathspec> в gitglossary[7].

-f
--force

Отключает проверку актуальности.

-n
--dry-run

Фактически не удаляет файлы. Вместо этого показывает, есть ли они в индексе и были бы удалены командой.

-r

Разрешает рекурсивное удаление, если указано имя родительского каталога.

--

Этот параметр позволяет отделить параметры командной строки от списка файлов (полезно, если имена файлов можно принять за параметры командной строки).

--cached

Используйте этот параметр, чтобы отменить подготовку путей и удалить их только из индекса. Файлы в рабочем дереве, изменённые или нет, останутся нетронутыми.

--ignore-unmatch

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

--sparse

Разрешает обновление записей индекса за пределами области разреженного извлечения. Обычно команда git rm отказывается обновлять записи индекса, пути которых не входят в область разреженного извлечения. Дополнительные сведения см. в git-sparse-checkout[1].

-q
--quiet

Обычно команда git rm выводит по одной строке (в форме команды rm) для каждого удалённого файла. Этот параметр подавляет вывод.

--pathspec-from-file=<file>

Шаблон пути передаётся в <file> вместо аргументов. Если <file> равен -, используется стандартный ввод. Элементы шаблона пути разделяются символами LF или CR/LF. Элементы шаблона пути можно заключать в кавычки, как описано для переменной конфигурации core.quotePath (см. git-config[1]). См. также --pathspec-file-nul и глобальный параметр --literal-pathspecs.

--pathspec-file-nul

Имеет смысл только вместе с --pathspec-from-file. Элементы шаблона пути разделяются символом NUL, а все остальные символы воспринимаются буквально (включая символы новой строки и кавычки).

Удаление файлов, отсутствующих в файловой системе

У команды git rm нет параметра для удаления из индекса только тех путей, которые отсутствуют в файловой системе. Однако, в зависимости от задачи, это можно сделать несколькими способами.

Использование «git commit -a»

Если при следующем коммите нужно записать все изменения отслеживаемых файлов в рабочем дереве, а также удаления файлов, удалённых из рабочего дерева с помощью rm (в отличие от git rm), используйте git commit -a: эта команда автоматически обнаружит и запишет все удаления. Аналогичного результата можно добиться и без коммита, используя git add -u.

Использование «git add -A»

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

Обычно сначала следует удалить все отслеживаемые файлы из рабочего дерева с помощью этой команды:

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

затем распаковать новый код в рабочее дерево. Другой вариант — rsync изменения в рабочее дерево.

После этого проще всего записать все удаления, добавления и изменения в рабочем дереве следующим образом:

git add -A

См. git-add[1].

Другие способы

Если требуется только удалить из индекса файлы, которых больше нет в рабочем дереве (например, если рабочее дерево содержит незафиксированные изменения и поэтому нельзя использовать git commit -a), используйте следующую команду:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

Подмодули

Из рабочего дерева будут удалены только подмодули, использующие gitfile (то есть клонированные с помощью Git версии 1.7.8 или новее), поскольку их репозиторий находится в каталоге .git суперпроекта. Если подмодуль (или один из вложенных в него) по-прежнему использует каталог .git, команда git rm переместит каталог Git подмодуля в каталог Git суперпроекта, чтобы сохранить историю подмодуля. Если в файле gitmodules[5] существует раздел submodule.<name>, он также будет удалён, а файл будет подготовлен к коммиту (если не используются параметры --cached или -n).

Подмодуль считается актуальным, если HEAD совпадает с записанным в индексе, в нём нет изменённых отслеживаемых файлов и неотслеживаемых файлов, которые не игнорируются. Игнорируемые файлы считаются ненужными и не препятствуют удалению рабочего дерева подмодуля.

Если нужно удалить из рабочего дерева только локальную копию подмодуля, не фиксируя удаление, вместо этого используйте команду deinit из git-submodule[1]. Дополнительные сведения об удалении подмодулей см. в gitsubmodules[7].

Примеры

git rm Documentation/\*.txt

Удаляет из индекса все файлы *.txt, находящиеся в каталоге Documentation и любых его подкаталогах.

Обратите внимание, что в этом примере звёздочка * заключена в кавычки, чтобы оболочка не обрабатывала её. Благодаря этому имена файлов и подкаталогов в каталоге Documentation/ раскрывает Git, а не оболочка.

git rm -f git-*.sh

Поскольку в этом примере звёздочку раскрывает оболочка (то есть список файлов указывается явно), файл subdir/git-foo.sh не удаляется.

Ошибки

При каждом обновлении суперпроекта, удаляющем заполненный подмодуль (например, при переключении между коммитами до и после удаления), в старом расположении остаётся устаревшая рабочая копия подмодуля. Удалять старый каталог безопасно только в том случае, если он использует gitfile, поскольку иначе будет также удалена история подмодуля. Этот шаг станет не нужен после реализации рекурсивного обновления подмодулей.

См. также

git-add[1]

rm

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-rm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API