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использованиеgitrmd*'отличается от использованияgitrmd/*', поскольку первый вариант также удалит весь каталогd2.Дополнительные сведения см. в статье о
<pathspec>в gitglossary[7]. -
-f -
--force -
Отключает проверку актуальности.
-
-n -
--dry-run -
Фактически не удаляет файлы. Вместо этого показывает, есть ли они в индексе и были бы удалены командой.
-
-r -
Разрешает рекурсивное удаление, если указано имя родительского каталога.
-
-- -
Этот параметр позволяет отделить параметры командной строки от списка файлов (полезно, если имена файлов можно принять за параметры командной строки).
-
--cached -
Используйте этот параметр, чтобы отменить подготовку путей и удалить их только из индекса. Файлы в рабочем дереве, изменённые или нет, останутся нетронутыми.
-
--ignore-unmatch -
Завершает работу с нулевым кодом возврата, даже если не найдено ни одного совпадающего файла.
-
--sparse -
Разрешает обновление записей индекса за пределами области разреженного извлечения. Обычно команда
gitrmотказывается обновлять записи индекса, пути которых не входят в область разреженного извлечения. Дополнительные сведения см. в git-sparse-checkout[1]. -
-q -
--quiet -
Обычно команда
gitrmвыводит по одной строке (в форме команды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, а не оболочка. -
gitrm-fgit-*.sh -
Поскольку в этом примере звёздочку раскрывает оболочка (то есть список файлов указывается явно), файл
subdir/git-foo.shне удаляется.
Ошибки
При каждом обновлении суперпроекта, удаляющем заполненный подмодуль (например, при переключении между коммитами до и после удаления), в старом расположении остаётся устаревшая рабочая копия подмодуля. Удалять старый каталог безопасно только в том случае, если он использует gitfile, поскольку иначе будет также удалена история подмодуля. Этот шаг станет не нужен после реализации рекурсивного обновления подмодулей.
См. также
rm
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-rm