git filter-branch从我的仓库中删除所有子模块

时间:2014-04-21 22:26:50

标签: git github revision-history git-rewrite-history

您好我已成功重写历史记录,并使用git filter-branch -f --prune-empty --tree-filter 'rm -rf <all unwanted dirs>'获取了我想要提取的5个文件夹并保留了所有git历史记录。

唯一剩下的问题是子模块,我已经提交了

Subproject commit <hash>

我希望从我的git历史中完全删除所有这些子模块提交,我该如何实现?

2 个答案:

答案 0 :(得分:1)

我用

完成了
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目录

答案 1 :(得分:0)

其他解决方案对我不起作用。在how to remove submodules上获得最高投票的答案之后,我使用了以下命令,该命令更加灵活,因为您可以在多个文件夹中指定子模块:

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文件。如果您只想删除特定的子模块,则该行可能需要其他工作。