如何编辑分支的历史记录,以仅保留影响一系列子目录中特定子目录的提交(和部分提交)?
基本上,我有一个大型的仓库,其中的一些子目录是相当独立的,但并不完全独立。在过去,这些都是独立的存储库,但是事实证明这是有问题的,因此我们将它们合并为1个存储库。通常这很好,但是在RoboCup进行了一周的黑客攻击后,我们希望将一个大分支拆分为几个较小的分支,以便于查看和分离拉取请求。
我在分支challenge_gpsr
上有一个子目录robocup
,我想为其创建一个单独的分支。 robocup
从189bd987
分支出来,由于我当前在分支robocup
上,所以HEAD
指向该分支中的最终提交。
运行
git filter-branch -f --index-filter "git rm --ignore-unmatch --cached -qr -- . && git reset -q \$GIT_COMMIT -- challenge_gpsr" --prune-empty -- "robocup" 189bd987..HEAD
仅保留challenge_gpsr
,但这不是我想要的,它也具有其他目录,但是它们的状态本质上应该是189bd987
的状态,而以下提交仅影响子目录{ {1}}。
如果可行,我对其他子目录重复此方法,并且可以分别检查每个子目录。
答案 0 :(得分:1)
我以前没有使用过git filter-branch
并且不知道它的存在,所以感谢:D,但是我很确定我可以在这里看到问题所在...
仅留下
challenge_gpsr
,但这不是我想要的。
这就是我希望从您的过滤器命令中看到的内容,请看一下每个步骤:
# 1 Remove everything from root-tree (from the new revision)
git rm --ignore-unmatch --cached -qr -- .
# 2 Restore challenge_gpsr sub-tree (from original revision)
git reset -q \$GIT_COMMIT -- challenge_gpsr
此操作在189bd987..HEAD
之间的每个修订版上运行,这将导致189bd987
之后的第一次提交删除challenge_gpsr
之外的所有内容,之后所有提交只会修改{{ 1}}。
...也具有其他目录,但是它们的状态本质上应该是
的状态challenge_gpsr
不是删除所有内容,而是将整个树恢复到189bd987
。然后从189bd987
恢复子树challenge_gpsr
。
$GIT_COMMIT