许多月前,我在我的git存储库中添加了一个子树。这个子树包含几个文件夹和文件。我添加了子树而不是创建子模块(如推荐)。现在我意识到我只需要子树中的一个文件,其余的都不需要。更糟糕的是,当其他人clonemy repository时,他们得到的并不是预期的,而是与子树和我创建的其他代码之间存在一些冲突。
我可以使用

git rm subtree–folder1 subtree_folder2 subtree_files.*

但是,我仍然有一个很长的子树提交历史。
自从我最初添加子树以来,我已经做了大量的开发,并且不能丢失我生成的提交历史记录。
简而言之,这就是我想要的:
删除所有子树文件/文件夹。
忘记所有子树提交的历史。
只留下我的代码和历史。
这有可能吗?
另一个可能的复杂之处是,我将想要保留的单头文件从子树移到了代码中的某个文件夹中。我希望这不是阻止我忘记子树历史的原因。
一次尝试
从远程服务器重新签出后,我有以下功能:
$ ls
.git             CMakeLists.txt   Read.cpp         logging.conf
.gitignore       ENDF6            TestData         src
.sparse-checkout LICENCE          doc              test
.travis.yml      README.md        include          tools

其中.gitignore只有:
构建/
调试/
当我按照建议尝试命令时,我没有得到非常满意的响应:
$ git filter-branch --index-filter 'git rm --cached -rf test tools src doc LICENCE README.md .travis.yml' HEAD
Rewrite 2fec85e41e40ae18efd1b130f55b14166a422c7f (1/1701)fatal: pathspec 'test' did not match any files
index filter failed: git rm --cached -rf test tools src doc LICENCE README.md .travis.yml

我不知道为什么它说当它明显存在的时候它会有问题。我很困惑。

最佳答案

您需要使用过滤器分支和--prune empty选项来删除不再引入新更改的任何提交。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch -rf dir1 dir2 dirN file1 file2 fileN' --prune-empty -f HEAD

之后,如果要恢复磁盘空间,则需要删除筛选分支保存的所有原始引用,使刷新过期,并进行垃圾收集。

关于git - 如何删除以前添加的git子树及其历史记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26107798/

10-13 05:35