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

Split a repository based on commits instead of directory or file type

我的 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 相对新添加的功能使人们喜欢声称他们“终于”添加了合并支持,但仍然不能很好地处理合并。)

所以你想做什么真的没关系-关键是你想改变整个回购的历史,taht更适合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