Как удалить файлы, которые .gitignored с рекурсивным шаблоном .../**?

Вот настройка:

git init
echo "foo/**" > .gitignore
mkdir foo && touch foo/bar
git status --ignored

Печатный статус говорит:

...
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
    foo/

Сейчас,

git clean -fdX

... и ничего не делает. foo/bar все еще там.

Обратите внимание: если я изменю правило .gitignore с foo/** на просто foo/, команда -fdX будет работать, как и ожидалось, — она удалит папку foo/.

Протестировано с git версии 2.29.1

Вероятно, это ошибка. Мне не совсем понятно, каково предполагаемое поведение с ** и git clean -X, но вы должны отправить этот пример в список рассылки Git.

torek 18.12.2020 15:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я протестировал его с помощью Git для Windows, и первая проблема возникает из-за двойных кавычек:

echo "foo/**" > .gitignore

Это даст вам файл .gitignore с:

"foo/**"

Этого достаточно, чтобы игнорировать папку foo, но не ее содержимое:
a git check-ignore -v -- foo\bar ничего не вернет.

Как описано в разделе «Как вы удаляете кавычки из строки ECHO в пакетном файле Windows?», используйте:

echo|set /p = "foo/**" > .gitignore

Таким образом, у вас есть .gitignore с:

foo/**

И git check-ignore -v -- foo\bar работает.

$ git check-ignore -v foo/bar
.gitignore:1:foo/       foo/bar

Однако в обоих случаях git clean -nfdX ничего не удаляет.

Только при прямом упоминании файла git clean предложит что-либо сделать:

vonc@vonc MINGW64 /d/git/tests/ign/foo (master)
$ git clean -nX

vonc@vonc MINGW64 /d/git/tests/ign/foo (master)
$ git clean -nX bar
Would remove bar

Чтобы это действительно работало, ваше правило не должно использовать «**».

echo|set /p = "foo/" > .gitignore

Тогда git clean -ndX сработает.

D:\git\tests\ign>git clean -ndX
Would remove foo/
Ответ принят как подходящий

Вкратце: вот обходной путь для очевидной ошибки в git clean -X:

git ls-files -oi --exclude-standard -z | xargs -0 rm

что без -z | xargs -0 rm будет git clean -nX, а с ним git clean -fX. Чтобы удалить (рекурсивно) пустые каталоги, find * -depth -type d -empty -delete.


В линуксе после

mkdir t1 t2 t3
touch t1/a1 t2/a2 t3/a3
printf %s\\n 't1/**' 't2/*' 't3' >.git/info/exclude

следующие две команды выводят разные результаты:

git ls-files -oc|git check-ignore --stdin
git clean -nX

но потом

touch t1/c1 t2/c2 t3/c3
git add -f t?/c?
git clean -nX

и git clean убирает t?/a? мусор. So clean не рекурсирует в полностью игнорируемые каталоги для -X.

редактировать: хуже, замена t3 на a3 в списке игнорирования и повторный запуск с c? потерянными или неотслеживаемыми файлами оставляет a3 нетронутым. Так что это даже не «полностью игнорируемые» каталоги, а «каталоги без отслеживаемого контента».

Да, здесь нужно что-то исправить.

Другие вопросы по теме