2013-11-11 7 views
1

С .gitignore:мерзавец чистый -ndX не удаляет каталог

foo/

и репозиторий из:

./quux 
./quux/foo 
./quux/foo/bar 
./quux/foo/bar/baz 

Как foo игнорируется, мерзавец предполагает рабочий каталог чист:

% git status 
# On branch master 
nothing to commit, working directory clean 

git clean -ndx принты:

% git clean -ndx 
Would remove quux/ 

Но git clean -ndX ничего не печатает. Я ожидаю, что он удалит quux/.

Это ошибка или какая-то функция gitignore, которую я не получаю? Если я добавлю файл в quux и зафиксирую его. Тогда git clean попытается удалить quux/foo/, как и ожидалось.

Мой git довольно новый: git version 1.8.3.4.

+0

это '/ quux/Foo/бар/baz' в файл или каталог? Есть ли другие файлы в вашем репозитории? – michas

+0

'baz' - это файл. Других файлов нет. Файлы вне 'quux /' никак не влияют на поведение. – phadej

ответ

3
$ git init . 
$ echo foo/ >.gitignore 
$ git add .;git commit -am ignore 
$ mkdir -p foo/bar bar/foo 
$ touch foo/bar/1 bar/foo/1 
$ git clean -ndx 
Would remove bar/ 
Would remove foo/ 
$ git clean -ndX 
Would remove foo/ 
$ 

git help clean говорит:

-X 
     Remove only files ignored by Git. This may be useful to rebuild 
     everything from scratch, but keep manually created files. 

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

В этом случае каталог bar создается вручную, а не явно игнорируется, поэтому он не будет удален.

То же самое верно для вашего каталога quux.

Чтобы «исправить» это вам нужно добавить каталог bar под управлением мерзавца путем добавления файла:.

$ touch bar/x 
$ git add bar/x 
$ git commit -am add\ x 
$ git clean -ndX 
Would remove bar/foo/ 
Would remove foo/ 
$ 
+0

Так что 'foo /' в корне рабочей директории явно игнорируется, но 'bar/foo /' просто неявно, поэтому не удаляется? Следующий вопрос: как очистить, чтобы неявно проигнорированные файлы также удалялись? Это чувствует себя как-то нелогично, как будто в 'bar /' tracked by git есть файл, чем 'bar/foo /' будет удален. – phadej

+0

Почти. 'bar' создается вручную, поэтому git ничего не трогает внутри. После добавления 'bar' в источник управления, каталог больше не считается ручным, и git будет делать то, что вы ожидаете. – michas

+0

Но как насчет 'git status', он показывает, что рабочий каталог чист, а он нет. IMHO есть несоответствие в определении «чистый», между «git clean» и «git status» – phadej

Смежные вопросы