Git filter-branch: 仅保留子目录下的提交记录

4

如何编辑分支的历史记录,只保留影响特定子目录(部分提交)的提交,从一系列提交中选择?

基本上,我有一个大仓库,其中一些子目录是相对独立的,但不完全独立。过去,这些是单独的存储库,但这证明是有问题的,因此我们将它们合并为1个存储库。通常这没问题,但是在RoboCup比赛进行了一周之后,我们希望将一个大分支拆分为几个较小的分支,以便更容易地进行审核和单独的拉取请求。

我想为分支robocup上的子目录challenge_gpsr创建一个单独的分支。robocup189bd987分支,因为我当前在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时的状态,而以下提交只影响子目录challenge_gpsr

如果这样可以,我会对其他子目录重复此方法,并可以单独查看每个子目录。

1个回答

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以外的所有内容,此后所有提交都将仅修改challenge_gpsr下的对象。

...也应该有其他目录,但它们的状态应该基本上与189bd987相同

不要删除所有内容,而是将整个树恢复到189bd987,然后从$GIT_COMMIT恢复子树challenge_gpsr
git filter-branch -f --index-filter " \
    git reset -q 189bd987 -- . && \
    git reset -q \$GIT_COMMIT -- challenge_gpsr \
" --prune-empty -- "robocup" 189bd987..HEAD

啊哈,当然这就是解决方案。我后来接近了,但没有意识到需要重置两次。谢谢! - Loy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接