$ 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_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