git rm
В начале использования Git часто возникает вопрос: «Как заставить Git больше не отслеживать какой-либо файл или несколько файлов?» Чтобы удалить файлы из репозитория Git, можно воспользоваться командой git rm
. Ее действие противоположно действию git add.
Обзор команды git rm
Команда git rm
позволяет удалять отдельные файлы или группы файлов. Основное назначение git rm
— удаление отслеживаемых файлов из раздела проиндексированных файлов Git. Кроме того, с помощью git rm
можно удалить файлы одновременно из раздела проиндексированных файлов и рабочего каталога. Удалить с ее помощью файл только из рабочего каталога нельзя. Файлы, в отношении которых выполняется команда, должны быть идентичны файлам в текущем указателе HEAD
. В случае расхождений между версией файла из указателя HEAD
и версией из раздела проиндексированных файлов или рабочего дерева Git заблокирует удаление. Такая блокировка является механизмом безопасности, который предотвращает удаление изменений в процессе их внесения.
Обратите внимание, что git rm
не удаляет ветки. Подробнее об использовании веток Git см. здесь.
Использование
<file>…
Указывает файлы, подлежащие удалению. Можно указать один файл, несколько файлов через пробел (file1 file2 file3
) или шаблон подстановки (~./directory/*
).
-f
--force
Параметр -f
применяется для отключения проверки безопасности, с помощью которой Git обеспечивает соответствие файлов в указателе HEAD
текущему содержимому раздела проиндексированных файлов и рабочего каталога.
Связанные материалы
Шпаргалка по Git
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
-n
--dry-run
Параметр dry run является защитным механизмом. Он позволяет выполнить пробный запуск команды git rm
без удаления файлов. В выходных данных отображаются файлы, которые должны были быть удалены.
-r
Параметр -r
— это сокращение от слова recursive. При выполнении команды git rm
в рекурсивном режиме она удаляет не только каталог назначения, но и все содержимое его вложенных каталогов.
--
Параметр разделителя позволяет явным образом отличить список имен файлов от аргументов, передаваемых команде git rm
. Разделитель полезен, когда какие-либо из файлов имеют имена, аналогичные параметрам команды.
--cached
Параметр cached указывает, что должны быть удалены только файлы, находящиеся в разделе проиндексированных файлов. Файлы в рабочем каталоге при этом остаются нетронутыми.
--ignore-unmatch
Этот параметр заставляет команду завершиться со статусом sigterm, равным 0, даже если файлы, указанные для удаления, не найдены. Sigterm — это код состояния в Unix. Код 0 указывает на успешный вызов команды. Параметр --ignore-unmatch
может быть полезен, если команда git rm
используется в составе скрипта оболочки, который должен обеспечивать корректную обработку отказа.
-q
--quiet
Параметр quiet скрывает вывод команды git rm
. Как правило, команда выводит по одной строке на каждый удаленный файл.
Отмена изменений, внесенных командой git rm
Изменения, вносимые при выполнении команды git rm
, не являются окончательными. Эта команда обновляет раздел проиндексированных файлов и рабочий каталог. Изменения не сохранятся, пока не будет создан новый коммит и они не будут добавлены в историю коммитов. Так что изменения, внесенные командой git rm, можно «отменить» с помощью стандартных команд Git.
git reset HEAD
Команда git reset восстановит раздел индексированных файлов и рабочий каталог до коммита HEAD
. В результате изменения, внесенные командой git rm
, будут отменены.
git checkout .
Такого же результата можно добиться с помощью команды git checkout: она восстановит последнюю версию файла из указателя HEAD
.
Если после выполнения git rm
был создан новый коммит, из-за которого удаление сохранилось, можно воспользоваться командой git reflog
, чтобы найти ссылку, предшествующую выполнению git rm
. Подробнее об использовании git reflog см. здесь.
Пояснения
Аргумент
, переданный команде, может содержать точные пути, шаблоны поиска файлов или точные имена каталогов. При выполнении команды удаляются только пути, зафиксированные в репозитории Git посредством коммитов.
В шаблонах поиска файлов можно задавать имена каталогов. При использовании шаблонов поиска следует быть внимательным. Рассмотрим примеры: directory/*
и directory*
. Использование первого шаблона приведет к удалению всех файлов в каталоге directory/
, тогда как второй вызовет удаление всех каталогов, имя которых начинается на directory — например, directory1
, directory2
, directory_whatever
и т. д., что может быть нежелательным.
Область действия команды git rm
Действие команды git rm
распространяется только на текущую ветку. Удаление выполняется только в деревьях рабочего каталога и раздела проиндексированных файлов. Удаление файла не сохраняется в истории репозитория до тех пор, пока не создан новый коммит.
Почему следует использовать git rm, а не rm
Репозиторий Git обнаруживает выполнение стандартной команды оболочки rm
для отслеживаемого им файла и соответствующим образом обновляет рабочий каталог. Но раздел проиндексированных файлов не обновляется. Чтобы внести в него изменения, для удаленных путей к файлам необходимо дополнительно выполнить команду git add
. Команда git rm
уменьшает количество действий, поскольку обновляет при удалении и рабочий каталог, и раздел проиндексированных файлов.
Примеры
git rm Documentation/\*.txt
В данном примере шаблон поиска файлов используется для удаления всех файлов *.txt
в каталоге Documentation
и всех его подкаталогах.
Обратите внимание, что символ звездочки * здесь экранируется символами косой черты. Это сделано, чтобы оболочка не расширяла шаблон. В таком варианте он включает только пути к файлам и подкаталогам, находящимся в каталоге Documentation/
.
git rm -f git-*.sh
В этом примере команда выполняется с параметром force для всех файлов, соответствующих шаблону подстановки git-*.sh
. Параметр force явным образом удаляет целевые файлы из рабочего каталога и раздела проиндексированных файлов.
Удаление файлов, которых уже нет в файловой системе
В разделе «Почему следует использовать git rm
, а не rm
» говорилось о том, что команда git rm
предусмотрена для удобства: она сочетает функции стандартной команды оболочки rm
и команды git add
, позволяя удалить файл из рабочего каталога и раздела проиндексированных файлов. Если удалить несколько файлов с помощью стандартной команды оболочки rm
, состояние репозитория может стать проблематичным.
Если требуется записать все явным образом удаленные файлы в следующий коммит, можно выполнить команду git commit -a
. Она внесет все события удаления в раздел проиндексированных файлов для подготовки к следующему коммиту.
Если же стоит задача безвозвратно удалить файлы, удаленные с помощью команды оболочки rm
, нужно воспользоваться следующей командой:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Эта команда создаст список удаленных файлов из рабочего каталога и передаст его команде git rm --cached
, которая обновит раздел проиндексированных файлов.
Команда git rm: заключение
Команда git rm
выполняет действия над двумя главными деревьями управления внутренним состоянием Git: рабочим каталогом и разделом проиндексированных файлов. Команда git rm
позволяет удалять файлы из репозитория Git. Это удобный инструмент, объединяющий функции стандартной команды оболочки rm
и команды git add
: сначала git rm удаляет целевой объект из файловой системы, а затем добавляет событие удаления в раздел проиндексированных файлов. Эта команда — одна из многих, которые можно использовать для отмены изменений в Git.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.