Вот настройка:
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 для 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
нетронутым. Так что это даже не «полностью игнорируемые» каталоги, а «каталоги без отслеживаемого контента».
Да, здесь нужно что-то исправить.
Вероятно, это ошибка. Мне не совсем понятно, каково предполагаемое поведение с
**
иgit clean -X
, но вы должны отправить этот пример в список рассылки Git.