【发布时间】:2014-11-24 07:29:38
【问题描述】:
很多个月前,我在git 存储库中添加了一个子树。该子树包括几个文件夹和文件。我添加了子树而不是创建子模块(如推荐的那样)。现在我意识到我只想要子树中的一个文件,其余的都不想要。更糟糕的是,当其他人clone我的存储库时,他们得到的不是预期的——与我创建的子树和其他代码存在一些冲突。
我可以使用
获取文件/文件夹git rm subtree–folder1 subtree_folder2 subtree_files.*
但是,我仍然留下了来自子树的冗长提交历史。
自从我最初添加子树以来,我已经进行了大量的开发,并且不能丢失我生成的提交历史记录。
简而言之,这就是我想要的:
- 删除所有子树文件/文件夹。
- 忘记所有子树提交的历史记录。
- 只留下我的代码和我的历史记录。
这可能吗?
PS。一种可能的复杂情况是,我将要保留的单个头文件从子树移到了代码中的某个文件夹中。我希望这不是让我忘记子树历史的原因。
一次尝试
从远程服务器重新结帐后,我得到以下信息:
$ 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
我不知道为什么它说它与test 存在问题,但它显然存在。我很困惑。
【问题讨论】:
-
您是否尝试过简单地使用
git rm <subtree name>删除子树? -
@hunch_hunch 我这样做了,这里的命令也一样:stackoverflow.com/questions/15890047/… 但我仍然拥有子树的所有历史记录。救命!
-
您可以通过 rebase 或 filter-branch 重写您的存储库历史记录吗?
-
@AndrewC 只要我保留更改的历史记录,我就可以重写我的存储库历史记录。
-
您是否尝试过树或索引过滤操作? kernel.org/pub/software/scm/git/docs/git-filter-branch.html
标签: git git-subtree