Close

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
СМ. РЕШЕНИЕ

Изучите 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.

Люди сотрудничают друг с другом, используя стену со множеством инструментов

Блог Bitbucket

Рисунок: DevOps

Образовательные программы DevOps

Демонстрация функций в демо-зале с участием экспертов Atlassian

Как инструмент Bitbucket Cloud работает с Atlassian Open DevOps

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up