Удаление ненужных файлов из истории, включая все ссылки с фильтром-веткой


Недавно я клонировал хранилище SVN, в котором раньше было несколько двоичных файлов, которые больше не нужны. К сожалению, я уже отправил его на Github с включенными двоичными файлами. Теперь я хочу удалить их с помощью "Git filter-branch", но я сталкиваюсь с некоторыми проблемами, когда дело доходит до тегов и ветвей.

В принципе, я создал простой скрипт оболочки для удаления списка файлов, которые были определены следующей командой:

git rev-list --objects --all | grep .jar > files.txt

Сценарий для удаление выглядит следующим образом:

#!/bin/sh
while read file_hash file_to_remove
do
    echo "Removing "$file_to_remove;
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $file_to_remove"
    rm -rf .git/refs/original/;
    git reflog expire --all --expire-unreachable=0;
    git repack -A -d;
    git prune
done < $1

У меня есть несколько тегов (все перечислены в .git / packed-refs), один .git / refs / remotes / origin (указывая на репозиторий Github). Удаление файлов с помощью приведенного выше скрипта не имеет желаемого эффекта ('du-cm' остается выводить тот же размер; 'git rev-list' все еще перечисляет файлы), пока я вручную не удалю все ссылки.git / packed-ссылки и тому подобное .каталог git/refs/remotes/origin.

Естественно, я теряю все теги, а также возможность вернуть мои локальные изменения на Github с помощью этого подхода. Есть ли что-то, что я пропустил, или есть альтернативный способ удаления файлов из всех ветвей/тегов без уничтожения моей истории?

Заранее большое спасибо, Matthes

1 3

1 ответ:

В итоге я использовал BFG Repo Cleaner на голом клонированном репозитории (git clone --mirror repo-url). Он проходит через каждую ветвь / тег, оставляя каждую работающей, и это даже намного быстрее, чем фильтр-ветвь. Надеюсь, это поможет другим людям, имеющим подобные проблемы.

Вот мой сценарий оболочки:

#!/bin/bash
#usage: ./remove_files.sh file_list.txt bare-repo-dir
while read file_hash file_to_remove
do
    echo "Removing "$file_to_remove;
    lastFile=`echo $file_to_remove | awk -F/ '{print $NF}'`;
    java -jar bfg.jar --delete-files $lastFile $2;
done < $1

cd $2;
git gc --prune=now --aggressive;
cd ..;