Git-从分支删除文件';历史

Git-从分支删除文件';历史,git,git-filter-branch,Git,Git Filter Branch,我有一个正在开发的本地存储库,我想在GitHub上公开分享(部分)。到目前为止我所做的: git checkout dev # dev is the current development branch of my local repository git branch public # create a new branch from dev for the public repo git checkout public git remote add public git@github.c

我有一个正在开发的本地存储库,我想在GitHub上公开分享(部分)。到目前为止我所做的:

git checkout dev  # dev is the current development branch of my local repository
git branch public  # create a new branch from dev for the public repo
git checkout public
git remote add public git@github.com  # add the public repo as a new remote
git push -u public public:master  # push local 'public' branch to 'master' branch of 'public' remote
但是,此推送失败,因为我的存储库包含一些相当大的子目录。所以我开始清理它:

git rm -r --cached external  # remove large subdirectory 'external'
git rm -r --cached ...  # repeat for other large subdirectories
然后,我将上述所有子目录也包括在
.gitignore
中并提交。调用
git ls
现在只显示少量文件,这些文件的总大小最多为几MB,而调用
git status
则不显示未提交或未跟踪的文件。但是,
git-push
仍然失败,显然是因为分支的历史记录中仍然包含较大的子目录

git filter-repo --invert-paths --path '/directory/to/delete'
从历史记录中清除文件的正确方法似乎是使用
git filter branch
命令,但是这个命令附带了很多警告,我不想在这个过程中弄乱我的整个存储库。如何正确地清除我在上面用
git rm
public
分支(以及仅
public
分支)的历史记录中删除的子目录(以及仅子目录)


由于该分支不太可能再合并到其他分支中,所以作为最后手段,我也可以简单地从中删除所有历史记录。其他分支仍然应该保持原样,但是在某种意义上,git中并不真正存在分支:它们只是指向特定提交的指针,并从那里指向导致该提交的历史。因此,您的存储库可能看起来像这样,示意图如下:

                    +-- E --- F   <- main branch
                   /
A --- B --- C --- D 
                   \
                    +-- G --- H   <- public branch
让我们假设这些文件首先添加到commit B中;我们现在可能有这样的东西:

git filter-repo --invert-paths --path '/directory/to/delete' --refs public
  +-- B --- C --- D -- E --- F   <- main branch
 /
A
 \
  +-- B2 --- C2 --- D2 --- G2 --- H2   <- public branch
commit B的原始版本(包含我们的大文件)现在与新的commit B2一起回到分支历史记录中

因此,与其担心哪些分支包含文件,哪些分支不包含文件,不如简单地用一个新名称复制存储库,并使其看起来好像这些文件在存储库的历史中从未存在过一样

git filter-repo --invert-paths --path '/directory/to/delete'
这将重写您的所有提交,提供一个全新的历史记录:

                       +-- E2 --- F2   <- main branch
                      /
A2 --- B2 --- C2 --- D2 
                      \
                       +-- G2 --- H2   <- public branch
+--E2--F2