git filter-branch удалить все подмодули из моего репо

Здравствуйте, я успешно переписал историю и получил 5 папок, которые хотел извлечь, используя git filter-branch -f --prune-empty --tree-filter 'rm -rf <all unwanted dirs>', и сохранил всю историю git.

Единственная оставшаяся проблема - это подмодули, у меня все еще есть коммиты, делающие

Subproject commit <hash>

и я хочу полностью удалить ВСЕ эти коммиты подмодулей из моей истории git, как я могу это сделать?


person Hausland    schedule 21.04.2014    source источник
comment
git rm их с помощью --index-filter ветки фильтра, а также git rm .gitmodules, пока вы это делаете, чтобы команда git submodule не думала, что они отсутствуют.   -  person jthill    schedule 22.04.2014
comment
Уже пробовал это, но в конце концов я получаю серые папки подмодуля-призрака.   -  person Hausland    schedule 22.04.2014
comment
Вам также потребуется git submodule deinit их.   -  person jthill    schedule 22.04.2014
comment
@jthill, как здесь stackoverflow.com/questions/19584255/   -  person Hausland    schedule 22.04.2014
comment
@jthill пытался git submodule deinit ., но я получаю ошибку git при запуске этого как части сценария --tree-filter   -  person Hausland    schedule 22.04.2014
comment
Нет, это не то, что вы делаете для каждого коммита, вы делаете это один раз. Я думаю, что внимательное чтение документации по подмодулям может очень помочь. Команда не делает и не делает ничего больше, чем говорит (то же самое и со всеми другими командами git). [...] Нет причин использовать --tree-filter, вы просто удаляете индекс.   -  person jthill    schedule 22.04.2014
comment
@jthill, но удалит ли это все коммиты с Subproject commit <someHashHere>?   -  person Hausland    schedule 22.04.2014
comment
@jthill Я хочу удалить все коммиты, связанные с подмодулями, из моей истории git   -  person Hausland    schedule 22.04.2014
comment
Первый комментарий jthill работал у меня с вложенным репозиторием, который похож на подмодуль. Однако вы должны передать параметр --ignore-unmatch в git rm, чтобы не произошло сбоя, когда файлов нет.   -  person spelufo    schedule 31.05.2015
comment
У меня была та же проблема, наконец, единственная история подмодулей находится в файле .gitmodules, поэтому, когда вы удаляете этот файл как часть --tree-filter (я использую индексный фильтр с git rm), а затем рекурсивно удаляете подмодуль папку, она должна очистить всю историю коммитов, так как единственная история коммитов подмодулей — это ссылка на хэш фиксации, который сохраняется в файле .gitmodules. (после процесса вам все равно нужно клонировать из основной папки репо в новую папку, чтобы избавиться от всего в папке .git afaik   -  person Emile Vrijdags    schedule 19.09.2016


Ответы (2)


я сделал это с

git filter-branch -f --prune-empty --tree-filter '
    git submodule deinit -f .
    git rm -rf lib && rm -rf lib
    find . -name .gitmodules -delete' HEAD

Предполагая, что все мои подмодули были расположены в каталоге lib

person seroperson    schedule 17.05.2016
comment
что, если мой подмодуль находится в корневом каталоге? - person pradyuman; 07.01.2017

Другое решение не сработало для меня. Следуя ответу с наибольшим количеством голосов на как удалить подмодули, я использовал следующую команду, которая является более гибкой, поскольку вы можете указать подмодули в нескольких папках:

git filter-branch -f --prune-empty --tree-filter '
    for SUBMODULE_DIR in submodule-dir-1 lib/submodule-dir-2 lib/submodule-dir-3
    do
        if [ -d $SUBMODULE_DIR ]; then
            git submodule deinit -f $SUBMODULE_DIR
            git rm -rf .git/modules/$SUBMODULE_DIR
            git rm -f $SUBMODULE_DIR
        fi
    done
    git rm -f --ignore-unmatch .gitmodules' HEAD

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

person Fabian Scheidt    schedule 08.07.2020