Git filter-branch:仅在子目录中提交提交

时间:2018-07-24 19:14:50

标签: git git-filter-branch

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

基本上,我有一个大型的仓库,其中的一些子目录是相当独立的,但并不完全独立。在过去,这些都是独立的存储库,但是事实证明这是有问题的,因此我们将它们合并为1个存储库。通常这很好,但是在RoboCup进行了一周的黑客攻击后,我们希望将一个大分支拆分为几个较小的分支,以便于查看和分离拉取请求。

我在分支challenge_gpsr上有一个子目录robocup,我想为其创建一个单独的分支。 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的状态,而以下提交仅影响子目录{ {1}}。

如果可行,我对其他子目录重复此方法,并且可以分别检查每个子目录。

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