В этом разделе мы подробно рассмотрим команду 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 ..." to unstage) new file: tracked_file Untracked files: (use "git add ..." to include in what will be committed) untracked_dir/ untracked_file

В примере создается новый репозиторий 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 можно передать значение , чтобы удалить конкретный файл.

 git clean -f  -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. Команда 6 поясняет назначение остальных команд:

 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 для полной отмены изменений и коммитов в репозитории.