【问题标题】:Git: Remove irrelevant commits from history after subtree splitGit:子树拆分后从历史记录中删除不相关的提交
【发布时间】:2015-10-29 20:50:00
【问题描述】:

我有一个 repo personal_stuff.git,我曾经用它来存储一大堆早期可能不完全的项目。

它们中的一个不时起飞,我必须将一个子文件夹从 personal_stuff/coolnewthing 拆分到它自己的 coolnewthing.git 存储库中。

为此,我使用

git subtree split -P personal_stuff/coolnewthing -b coolnewthing

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

git pull ../../../../personal_stuff coolnewthing

这很好用,但在我的历史记录中,所有这些提交都与不再存在的文件相关。

如何过滤掉这些并仅保留与我仍然拥有的文件相关的提交?

【问题讨论】:

  • 你可以使用“git rebase -i”
  • 不确定我是否理解文档,但我没有将功能分支添加到主要分支 - 我正在做相反的事情。这仍然适用吗?
  • 切换到新分支执行 git rebase -i HEAD~ 并使用交互式 rebase 菜单。 @joran 给出的解决方案似乎很好用。
  • 我应该补充一点,这不再是一个新分支,它是一个全新的 repo - 只是从以前的 repo 中提交了它曾经是它的一部分
  • 没关系,它仍然可以工作,但请尝试 git rebase -i 这是一个很棒的工具 :)

标签: git bitbucket git-commit git-subtree


【解决方案1】:

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

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

注意:这个新的本地仓库的来源仍然是url-to-personal_stuff.git,所以你需要在推送之前更改来源

git remote set-url origin <url-to-coolnewthing.git>

【讨论】:

  • 这比子树分割好吗?我很喜欢你的方法,但我已经把我的子目录分开了。 cd coolnewthing; git filter-branch --subdirectory-filter ./ 告诉我refs/heads/master is unchanged
  • 你需要从顶层运行git filter-branch --subdirectory-filter
  • 我是,但coolnewthing 已经是它自己的仓库,所以它不能过滤personal_stuff 以获取coolnewthing。我认为....
  • 啊哈 - git filter-branch --subdirectory-filter &lt;relative/location/in/old/repo/folder&gt; 成功了。谢谢!
  • 我还应该补充一点,由于我在personal_stuff 中的最后一次提交是删除了coolnewthing 子目录,因此与新存储库中的那个子文件夹相关的最后一次提交在其中没有文件( !!!) 简单的解决方案,git-log 找到您仍然有文件的最后一次提交,然后git reset --hard &lt;commithash&gt;。然后要更新新的遥控器,请执行git push --force origin master。容易……
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2012-04-06
  • 2014-05-05
  • 1970-01-01
  • 2013-08-03
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多