Git:在子树拆分后从历史记录中删除不相关的提交

Git:在子树拆分后从历史记录中删除不相关的提交,git,bitbucket,git-commit,git-subtree,Git,Bitbucket,Git Commit,Git Subtree,我有repopersonal\u stuff.git,我用它存储了一大堆早期的项目,可能并不完全是项目 每隔一段时间就会有一个文件夹启动,我必须将personal\u stuff/coolnewthing中的一个子文件夹拆分为它自己的coolnewthing.gitrepo 要做到这一点,我使用 git子树拆分-p personal_stuff/coolnewthing-b coolnewthing 然后通过以下方式从另一个新git目录中提取新分支: git pull../../../../pe

我有repo
personal\u stuff.git
,我用它存储了一大堆早期的项目,可能并不完全是项目

每隔一段时间就会有一个文件夹启动,我必须将
personal\u stuff/coolnewthing
中的一个子文件夹拆分为它自己的
coolnewthing.git
repo

要做到这一点,我使用

git子树拆分-p personal_stuff/coolnewthing-b coolnewthing

然后通过以下方式从另一个新git目录中提取新分支:

git pull../../../../personal\u stuff coolnewthing

这非常有效,但我的历史记录中有所有这些提交都与不再存在的文件相关


如何筛选出这些文件并仅保留与我仍然拥有的文件相关的提交?

您可以从原始repo创建一个新的克隆,并为此新的本地repo选择一个新的根目录

git clone <url-to-personal_stuff.git> coolnewthing
cd coolnewthing
git filter-branch --subdirectory-filter coolnewthing

您可以使用“git-rebase-i”不确定我是否理解这些文档,但我并不是在主文档中添加功能分支,而是相反。这仍然适用吗?切换到新分支,执行git rebase-i HEAD~并使用交互式rebase菜单。@joran给出的解决方案似乎很好地利用了这一点。我应该补充一点,这不再是一个新的分支,它是一个全新的回购协议-只是从以前的回购协议中得到了承诺-它曾经是协议的一部分好吧,它仍然可以工作,但请尝试git rebase-我认为它是一个出色的工具:)这比子树拆分更好吗?我很喜欢你的方法,但我已经把我的子目录拆分了<编码>光盘冷却;git filter branch—subdirectory filter./告诉我,
refs/heads/master是不变的
您需要从顶层运行
git filter branch—subdirectory filter
,但是
coolnewthing
已经是它自己的回购,所以它不能为coolnewthing过滤
个人的东西。我想…啊哈-
git过滤器分支——子目录过滤器
成功了。谢谢我还应该补充一点,由于我在
personal_stuff
中的最后一次提交是删除了
coolnewthing
子目录,因此与新repo中的该子文件夹相关的最后一次提交中没有文件(!!!)简单解决方案,
git log
在仍有文件的地方查找最后一次提交,然后,
git重置——硬的
。然后要更新新的遥控器,您需要执行git push--force origin master
。容易的。。。。
git remote set-url origin <url-to-coolnewthing.git>