--tree-filter
не работает на/с индексом. Вместо этого он копирует каждую фиксацию во временную директорию, используемую в качестве рабочего дерева, запускает вашу команду во временном каталоге и делает новый коммит из всех оставшихся файлов и/или является новым во временном каталоге. Изменения, которые вы делаете для самого индекса во время этого процесса, фактически игнорируются.
Это означает, что вы должны удалить из дерева именно те файлы, которые ваш новый .gitignore
не смог добавить. Вы можете сделать это вручную с помощью git rm --cached
в --index-filter
, что было бы намного быстрее, но если вы хотите получить git, чтобы выполнить работу для вас в --tree-filter
, вы можете использовать тот же самый трюк git, который использует (см. Сноску): use git clean
(с -x
), чтобы очистить временный каталог.
Это не совсем верно: --tree-filter
кода filter-branch
«s использует git read-tree
для заполнения индекса до (ре) Наполнение временного каталога (который, в свою очередь, означает, что он должен сделать какую-то работу, чтобы вычистить временный каталог из предыдущих коммитов, для которого он использует git clean
). Затем, после фильтра eval
, он снова использует индекс для проверки того, что было сделано во временном каталоге. Когда вы git rm -r --cached .
, а затем git add .
, он сравнивает результирующий индекс, который больше не имеет ваших проигнорированных файлов, к дереву рабочих и ... добавляет ваши проигнорированные файлы. Argh!