Один из способов сделать это - удалить все, кроме файла, который вы хотите сохранить.
По сути, сделайте копию репозитория, а затем git filter-branch
удалите все, кроме файлов / папок, которые вы хотите сохранить.
Например, у меня есть проект, из которого я хочу извлечь файл tvnamer.py
в новый репозиторий:
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
Это используется git filter-branch --tree-filter
для прохождения каждой фиксации, запуска команды и повторного подтверждения полученного содержимого каталогов. Это чрезвычайно разрушительно (поэтому вы должны делать это только с копией своего репозитория!) И может занять некоторое время (около 1 минуты для репозитория с 300 коммитами и примерно 20 файлами).
Приведенная выше команда просто запускает следующий сценарий оболочки для каждой ревизии, который вам, конечно же, придется изменить (чтобы он исключал ваш подкаталог вместо tvnamer.py
):
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
Самая большая очевидная проблема заключается в том, что он оставляет все сообщения фиксации, даже если они не связаны с оставшимся файлом. Скрипт git-remove-empty-commits исправляет это ..
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
Вам нужно снова -f
запустить аргумент force filter-branch
с чем-либо refs/original/
(что в основном резервное копирование)
Конечно, это никогда не будет идеальным, например, если в ваших сообщениях о фиксации упоминаются другие файлы, но это примерно настолько близко, насколько позволяет текущий git (насколько мне известно).
Опять же, запускайте это только на копии вашего репозитория! - но в целом, чтобы удалить все файлы, кроме thisismyfilename.txt:
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'