Git clean
В этом разделе мы подробно рассмотрим команду git clean
. Команда git clean
в некоторой степени является командой отмены действия. Можно также сказать, что git clean
дополняет другие инструменты, такие как git reset и git checkout. Эти две команды нужны в работе с файлами, ранее добавленными в индекс отслеживания Git, в то время как git clean
используется для операций с неотслеживаемыми файлами, то есть с такими, которые созданы в рабочем каталоге репозитория, но еще не добавлены в индекс отслеживания с помощью git add.
Рассмотрим различия между отслеживаемыми и неотслеживаемыми файлами более наглядно на следующем примере командной строки.
$ mkdir git_clean_test
$ cd git_clean_test/
$ git init .
Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/
$ echo "tracked" > ./tracked_file
$ git add ./tracked_file
$ echo "untracked" > ./untracked_file
$ mkdir ./untracked_dir && touch ./untracked_dir/file
$ git status
On branch master
Initial commit
Changes to be committed: (use "git rm --cached <file>..." to unstage)
new file: tracked_file
Untracked files: (use "git add <file>..." to include in what will be committed) untracked_dir/ untracked_file
Связанные материалы
Шпаргалка по Git
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
В примере создается новый репозиторий Git в каталоге git_clean_test
. Далее создается отслеживаемый файл tracked_file
, который включается в индекс Git, затем создается неотслеживаемый файл untracked_file
и неотслеживаемый каталог untracked_dir
. Далее вызывается команда git status
— эта операция отображает данные о внутреннем состоянии отслеживаемых и неотслеживаемых изменений в Git. При текущем состоянии репозитория можно выполнить команду git clean
, чтобы понять принцип ее работы.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
Если на этом этапе выполнить команду git clean
в конфигурации по умолчанию, может возникнуть критическая ошибка. Выше показан пример такой ошибки. По умолчанию в Git используется глобальная настройка, которая требует при запуске git clean
передавать команде параметр force. Это важный механизм обеспечения безопасности. Отменить действие команды git clean
невозможно. По завершении выполнения git clean
происходит окончательное удаление данных из файловой системы (как и в случае с командой rm), поэтому перед выполнением убедитесь, что неотслеживаемые файлы действительно нужно удалить.
Распространенные параметры и варианты использования
Мы рассмотрели поведение и особенности команды git clean. Теперь перейдем к изучению различных примеров использования git clean и сопутствующих параметров командной строки.
-n
Параметр -n запускает тестовый прогон команды git clean. Этот прогон позволяет определить файлы, которые будут удалены, без фактического удаления. Рекомендуется всегда сначала выполнять тестовый прогон git clean. Изучим работу параметра в демонстрационном репозитории, созданном ранее.
$ git clean -n
Would remove untracked_file
Данные вывода указывают, что файл untracked_file
будет удален при выполнении команды git clean
. Обратите внимание, что каталог untracked_dir
не указан в этих данных. По умолчанию git clean
не обрабатывает каталоги рекурсивно. Это еще один механизм обеспечения безопасности, предотвращающий окончательное удаление по ошибке.
-f or --force
Параметр force инициирует фактическое удаление неотслеживаемых файлов из текущего каталога. Этот параметр является обязательным, если для параметра конфигурации clean.requireForce
не установлено значение false. При этом не будут удалены неотслеживаемые папки или файлы, указанные в файле .gitignore
. Теперь выполним рабочий прогон git clean
в демонстрационном репозитории.
$ git clean -f
Removing untracked_file
Эта команда выводит удаляемые файлы. Здесь видно, что файл untracked_file
удален. Если на этом этапе выполнить команду git status или ls, можно также увидеть, что файл untracked_file удален и не может быть найден. По умолчанию git clean -f обрабатывает все неотслеживаемые файлы в текущем каталоге. Кроме того, параметру -f можно передать значение < path >, чтобы удалить конкретный файл.
git clean -f <path>
-d include directories
Параметр -d сообщает команде git clean о том, что необходимо удалить также любые неотслеживаемые каталоги. Команда не обрабатывает их по умолчанию. Можно добавить параметр -d в предыдущие примеры:
$ git clean -dn
Would remove untracked_dir/
$ git clean -df
Removing untracked_dir/
Здесь мы выполнили тестовый прогон команды, добавив комбинацию параметров -dn. Вывод команды показывает, что неотслеживаемый каталог untracked_dir будет удален. После выполнения принудительной команды clean мы видим, что каталог untracked_dir удален.
-x force removal of ignored files
При выпуске программного обеспечения принято использовать каталог сборки или распределения, не привязанный к индексу отслеживания репозитория. Каталог сборки содержит динамические артефакты сборки, создаваемые на основе исходного кода в репозитории. Обычно каталог сборки добавляется в файл репозитория .gitignore. Очистку этого каталога удобно выполнять вместе с удалением других неотслеживаемых файлов. При добавлении параметра -x команда git clean удалит в том числе игнорируемые файлы. Как и прежде, перед окончательным удалением рекомендуется выполнить тестовый прогон команды git clean. Параметр -x обрабатывает все игнорируемые файлы, а не только те, что используются в сборке проекта. К ним могут относиться различные побочные файлы, такие как файлы конфигурации IDE ./.idea.
git clean -xf
Как и параметр -d, параметр -x можно передавать и сочетать с другими параметрами. В этом примере показана комбинация с параметром -f, которая удаляет неотслеживаемые файлы из текущего каталога вместе с файлами, обычно игнорируемыми Git.
Интерактивный режим или интерактивная команда git clean
Команду git clean
можно использовать не только со специальными параметрами, которые были рассмотрены выше, но и в «интерактивном» режиме. Этот режим запускается с помощью параметра -i
. Вернемся к демонстрационному репозиторию из первой части документа. Из этого начального состояния запустим интерактивный сеанс очистки.
$ git clean -di
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now>
Мы запустили интерактивный сеанс с параметром -d
, поэтому каталог untracked_dir
также будет обработан. В интерактивном сеансе отобразится запрос What now>
на применение одной из команд к неотслеживаемым файлам. Принцип работы команд вполне очевиден из их названия. Вкратце рассмотрим каждую из них в произвольном порядке, начиная с 6: help
. Это позволит лучше понять назначение последующих команд.
What now> 6
clean - start cleaning
filter by pattern - exclude items from deletion
select by numbers - select items to be deleted by numbers
ask each - confirm each deletion (like "rm -i")
quit - stop cleaning
help - this screen
? - help for prompt selection
5: quit
Эта простая команда выполняет выход из интерактивного сеанса.
1: clean
Данная команда удаляет выбранные элементы. Выполнение команды 1: clean
на этом этапе приведет к удалению untracked_dir/ untracked_file
.
4: ask each
Эта команда обращается к каждому неотслеживаемому файлу и выводит запрос на его удаление (Y/N
). Операция выглядит следующим образом:
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 4
Remove untracked_dir/ [y/N]? N
Remove untracked_file [y/N]? N
2: filter by pattern
Эта команда выводит дополнительный запрос, который использует входные данные для фильтрации списка неотслеживаемых файлов.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 2
untracked_dir/ untracked_file
Input ignore patterns>> *_file
untracked_dir/
Ввод подстановочного шаблона *_file
на этом этапе ограничит список неотслеживаемых файлов каталогом untracked_dir
.
3: select by numbers
Как и команда 2, команда 3 ограничивает список неотслеживаемых файлов. В интерактивном сеансе будут представлены номера, соответствующие именам неотслеживаемых файлов.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 3
1: untracked_dir/ 2: untracked_file
Select items to delete>> 2
1: untracked_dir/ * 2: untracked_file
Select items to delete>>
Would remove the following item:
untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
Резюме
Подведем итог: команда git clean
представляет собой удобный способ удаления неотслеживаемых файлов в рабочем каталоге репозитория. Неотслеживаемые файлы — это файлы в каталоге репозитория, которые еще не добавлены в раздел проиндексированных файлов с помощью git add. Результат использования git clean
в целом можно получить с помощью команды git status и встроенных средств удаления в операционной системе. Команду git clean
можно использовать вместе с git reset для полной отмены изменений и коммитов в репозитории.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.