Русский ▾ Topics ▾ Latest version ▾ git-rm last updated in 2.50.0

НАЗВАНИЕ

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

ОБЗОР

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
       [--quiet] [--pathspec-from-file=<файл> [--pathspec-file-nul]]
       [--] [<спецификатор-пути>…​]

ОПИСАНИЕ

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

ПАРАМЕТРЫ

<спецификатор-пути>…

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

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

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

Для получения более подробной информации см. запись <спецификатор-пути> в gitglossary[7].

-f
--force

Пропустить проверку актуальности.

-n
--dry-run

Не удалять файл(ы) на самом деле. Вместо этого просто показать, существуют ли они в индексе и будут ли удалены командой.

-r

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

--

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

--cached

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

--ignore-unmatch

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

--sparse

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

-q
--quiet

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

--pathspec-from-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”

При получении нового кода для ветки поставщика (vendor branch) вы, вероятно, захотите записать как удаление путей, так и добавление новых путей, а также изменения существующих путей.

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

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 суперпроекта, чтобы защитить историю подмодуля. Если он существует, раздел submodule.<имя> в файле gitmodules[5] также будет удалён, и этот файл будет проиндексирован (staged) (если не используются --cached или -n).

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

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

ПРИМЕРЫ

git rm Documentation/\*.txt

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

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

git rm -f git-*.sh

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

ОШИБКИ

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

СМ. ТАКЖЕ

GIT

Является частью пакета git[1]