在保留历史记录WITH重命名的同时提取git子目录

Rus*_*ull 12 git git-filter-branch

我将一个大的源代码树分成两个独立的组件和一个共享的子模块.为了准备这个拆分,我首先将共享的东西移动到一个"公共"目录中,更新了所有引用,并进行了提交.到现在为止还挺好.现在我想将该目录解压缩到子模块中.

通常我会这样做

git filter-branch --subdirectory-filter
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,所有有趣的历史都发生在该子目录之外,因此历史丢失了.

我知道保留完整的历史记录是没有意义的,因为这根本不会过滤掉任何数据.但我真的不想回到过去和构建的能力,我只是希望能够查看每个文件所属的提交.

有没有办法在保留单个文件的历史记录的同时保持过滤器分支行为?

Amb*_*ber 4

并不真地。--subdirectory-filter是一种特殊情况,因为它实际上显着修改了树的内容(因为它将内容向上移动了一个或多个目录嵌套级别)。

因此,在您要过滤的子目录之外的文件与可以作为结果中提交的一部分存储的树之间并没有真正的良好映射。

请记住,这filter-branch完全重写了您的历史记录 - 输出是一组全新的提交,并且与旧提交没有任何“链接”,因此任何额外信息都必须作为新提交的一部分来表达。

  • 这对我来说都是有意义的,但至少原则上我可以想象在目录中获取当前的文件集并追溯每个文件的提交历史记录,计算重命名。这样,每个提交对象要么涉及子目录中的文件,要么不涉及子目录中的文件。那些不涉及它们的文件可以被删除,那些涉及它们的文件可以被重写以省略其他文件。我不介意在我的历史的尽头做出一个举动,我只是想保持所有的改变。 (2认同)