Git clean: что означает "не удалить"?

Когда я запускаю git clean --dry-run, результаты немного напоминают:

Would remove an_untracked_file
Would remove an_untracked_file_2
Would not remove some_unrelated_folder/subfolder/

"Несвязанные" папки отслеживаются и не имеют никаких изменений, поэтому я не ожидал, что git удалит их.

Но почему git сообщает Would not remove для некоторых, но не для всех моих обычных (и полностью нетронутых) файлов проекта?

Могу ли я сказать, что вызывает git, но потом решить, удалить их?

git status перечисляет только пару не отслеживаемых файлов, о которых я знаю. Как и ожидалось.

git ls-files --other --exclude-standard возвращает те же самые несанкционированные файлы. Как и ожидалось.

git ls-files --other --exclude-standard --directory возвращает те же самые несанкционированные файлы, плюс куча, казалось бы, обычных каталогов. Это не то, что я ожидал увидеть, поскольку я думал, что целью --directory было сокращение, а не увеличение количества возвращенных результатов.

При проверке неожиданных каталогов, кажется, каждый из них пуст, кроме подпапки ".gitignore" d.svn. Возможно, это влияет на вещи.

Может ли кто-нибудь помочь мне понять это поведение?

Спасибо

Ответ 1

По умолчанию git clean не удаляет папки. Он говорит вам, что видит неподписанную папку, но не удаляет ее. Дайте ему флаг -d, чтобы он также проинструктировал об удалении каталогов, как в git clean -d -n

Ответ 2

Могу ли я сказать, что вызывает git, но потом решить, удалить их?

Вы действительно можете! (С июля 2013 года, предстоящий git 1.8.4):
Команда "git clean" выучила интерактивный режим.

См. выполнить 17696002086e8c6b9e998543d212e707c7d511ab для начальной реализации:

См. совершить d1239264f2786d7ea15543b980c6bf6afbc4701a для реализации:

Добавить новое действие для интерактивного git-clean: фильтра по шаблону.
Когда пользователь выбирает это действие, пользователь может вводить шаблоны, разделенные пробелами (тот же синтаксис, что и gitignore), и каждый чистый кандидат, соответствующий одному из шаблонов, будет исключен из очистки.
Когда пользователь почувствует это в порядке, нажмите ENTER и откройте диалоговое окно подтверждения.

См. фиксация db627fd568410499c47d764937c3d7a10bbadffa для тестов и примеров.

Смотрите зафиксировать c0be6b4c8a1d16a92efad00d73683075cf2da60d для документации

Показать, что будет сделано и очистить файлы в интерактивном режиме.


Интерактивный режим

Когда команда переходит в интерактивный режим, она показывает файлы и каталоги, которые нужно очистить, и переходит в интерактивный командный цикл.

Цикл команд показывает список доступных подкоманд и дает подсказку " What now>".
В общем случае, когда приглашение заканчивается одним ">", вы можете выбрать только один из выбранных вариантов и набрать return, например:

------------
  *** Commands ***
  1: clean                2: filter by pattern    3: select by numbers
  4: ask each             5: quit                 6: help
  What now> 1
------------

Вы также можете сказать c или clean выше, пока выбор уникален.

Основной командный цикл имеет 6 подкоманд.

clean::

Запустите очистку файлов и каталогов, а затем закройте.

filter by pattern::

Показывает файлы и каталоги, которые нужно удалить, и выдает приглашение "Input ignore patterns>>".
Вы можете вводить пространственно разделенные шаблоны, чтобы исключить из удаления файлы и каталоги.
Например. "*.c *.h" будет исключать файлы с ".c" и ".h" из удаления.
Когда вы удовлетворены отфильтрованным результатом, нажмите ENTER (пустой) обратно в главное меню.

select by numbers

Показывает файлы и каталоги, которые нужно удалить, и выдает запрос "Select items to delete>>".
Когда приглашение заканчивается двойным ">>" следующим образом, вы можете сделать несколько вариантов, объединенных с пробелом или запятой.
Также вы можете сказать диапазоны.
Например. "2-5 7,9" выбрать 2,3,4,5,7,9 из списка.
Если второе число в диапазоне опущено, все остальные патчи взяты.
Например. "7-", чтобы выбрать 7,8,9 из списка.
Вы можете сказать "*", чтобы выбрать все.
Также, когда вы удовлетворены отфильтрованным результатом, нажмите ENTER (пустой) обратно в главное меню.

ask each::

Это начнет чистку, и вы должны подтвердить один за другим, чтобы удалить элементы.
Обратите внимание, что это действие не так эффективно, как эти два действия.

quit::

Это позволяет вам выйти без очистки.

help::

Покажите краткое использование интерактивного git -clean.

Ответ 3

Если некоторые файлы и папки продолжают сбой при выполнении команды, запустите

git clean -d -f

-f заставит операцию.

Используйте -n для сухого хода.

Ответ 4

Этот ответ в основном предназначен для справочных целей, поскольку я считаю это наиболее распространенным сценарием для очистки вашего репо.

Чтобы удалить все нерекционированные каталоги рекурсивно:

git clean -d -f -x

-d для каталогов, -x для удаления каталогов в вашем списке игнорирования тоже (например, bin и build), и это то, что мне нужно большую часть времени и -f, чтобы подтвердить, что вы знаете, что делаете.

Ответ 5

Я использую git версию 2.10.0 на mac, и почему-то я не могу использовать

git clean -df

чтобы удалить необработанные файлы, поэтому я использовал это вместо:

git checkout -

PS:

если кто-нибудь может объяснить в комментариях, почему я не могу использовать

git clean -df

чтобы удалить файлы, я был бы очень благодарен.. спасибо

ПРЕДУПРЕЖДЕНИЕ вы также потеряете свои отслеживаемые файлы: (