根据提交而不是目录或文件类型拆分存储库

问题描述

我的 git 存储库变得越来越大,所以我想将其拆分为一个或多个存储库。 搜索时我可以找到很多基于git-filter-branch解决方案,这将重写整个存储库。

但是我想删除文件都与单独的提交隔离,所以我不必重写包含文件的提交,我只需要删除那些提交。 IE。提交标签可以保持不变。对我来说,它看起来是一个比使用 git-filter-branch 更漂亮的解决方案。

所以我的想法是我应该制作存储库的副本,以便在拆分完成后用户将使用该副本。 在此之后,我将删除不需要的提交,例如 git rebase -i删除所有不需要的提交。 但是有很多提交应该删除,那么有什么方法可以将它作为脚本运行吗?或者,如果它是一个完整的提交被删除了,那么 git-filter-branch 可能已经在这样做了!?

有没有办法在所有分支上自动执行?

那么您认为这是一个方法,还是我应该使用 git-filter-branch 代替?

那么我想从这三个中做什么:

A - B - C - D - E - F
  \
   G - H - I - J

去除C、E和H:

A - B  - D  - F
  \
   G - I - J

解决方法

为此使用 rebase 有几个问题。它一次只想在一个分支上工作(并没有真正解决其他参考)。它不能很好地处理合并。 (Evel 相对较新的特性让人们喜欢声称他们“终于”添加了合并支持,但仍然不能很好地处理合并。)

因此,您尝试做什么实际上并不重要 - 关键是您想要更改整个存储库的历史记录,并且它更适合 git filter-repo (或者,正如您所注意到的,git filter-branch;但这是一个已经失宠的旧工具)。

这两种工具都可以满足您的需求。也就是说,您可以设置一些选项,以便在重写提交以不进行任何更改时,删除该提交。 (因此,在您的示例中,如果您要删除文件,并且提交仅修改该文件,则提交将不再进行任何更改并将被删除。)

filter-branchfitler-repo 的用法非常不同,因此您必须先决定使用哪个。除非您必须使用不能支持它的旧版本 git,否则 filter-repo 可能是更好的建议(尤其是因为,根据您所写的内容,您似乎必须学习一种新工具无论哪种方式)。

这两种工具也非常通用,有很多选项可以控制它们的作用;而且它们也非常强大,所以你真的应该对它们有一个体面的了解,而不是仅仅遵循我们可以给你的一些食谱(然后不知道如果出现问题该怎么办)。所以最好的建议是阅读文档:

https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html