Вот как вы можете использовать git filter-branch, чтобы избавиться от всех файлов, которые вам не нужны:
Получить список имен файлов, которые вы не хотитеВ истории появляются как старые имена, так и новые имена в случае переименования.Например, поместите их в файл с именем toberemoved.txt
Запустите git filter-branch следующим образом:
$ git filter-branch --tree-filter "rm -f `cat toberemoved.txt`" branch1 branch2 ...
Вот соответствующий человекстраница из git filter-branch:
--tree-filter <command>
This is the filter for rewriting the tree and its contents. The
argument is evaluated in shell with the working directory set to
the root of the checked out tree. The new tree is then used as-is
(new files are auto-added, disappeared files are auto-removed -
neither .gitignore files nor any other ignore rules HAVE ANY
EFFECT!).
Так что просто убедитесь, что список файлов, которые вы хотите удалить, относится к корню извлеченного дерева.
Обновление:
Чтобы получить список файлов, которые присутствовали в прошлом, но отсутствовали в текущем рабочем каталоге, вы можете запустить следующее.Обратите внимание, что вам придется приложить дополнительные усилия, чтобы сохранить «историю перед переименованием» переименованных файлов:
$ git log --raw |awk '/^:/ { if (! printed[$6]) { print $6; printed[$6] = 1 }}'|while read f;do if [ ! -f $f ]; then echo Deleted: $f;fi;done
То, что $ 6 - это имя файла, на который повлиял коммит, показано в --raw mode of log.
См. параметр --diff-filter для git log, если вы хотите знать, что произошло ([D] eleted, [R] enamed, [M] odified и т. д.), чтобыкаждый файл для каждого коммита.
Может быть, другие могут подсказать, как узнать предыдущее имя отслеживаемого файла в случае переименования.