重命名文件夹后进行Git过滤

3

我有这样的情况。

我正在重构我的代码库,将其分成两个src文件夹,以便我可以使用git filter-branch拆分文件夹。

因此,我创建了AAA和BBB文件夹来替代src。

问题在于,当我按照Detach (move) subdirectory into separate Git repository时,我会得到没有历史记录的断开连接的git提交。

0 | 0 <--- 在这里中断 0 | 0 | 0 | 0 ...

我也尝试使用How to split a git repository and follow directory renames?,将BBB和AAA放入Name1和Name2中,但它不起作用。

在这方面能提供任何帮助吗?我知道这可以做到 :)

2个回答

0

问题

如果我理解你的意思正确,你的 git 历史记录中有三个文件夹:srcAAABBB。 在整个历史过程中,你只有一个src文件夹,在最后一次提交时,你将文件从src分离到AAABBB中,因此删除了src,并创建了另外两个文件夹。

在图形化历史视图中(每条线都是一个提交,最新的提交在顶部,就像在 gitk 中一样):

AAA, BBB
src
src
src
src
.
.
.

如果你现在使用 git filter-branch --prune-empty -subdirectory-filter AAA,它会从历史记录中每个提交中删除除文件夹 AAA 内容以外的所有内容(然后将 AAA 设为新的根目录)。由于文件夹 AAA 只存在于历史记录中的一个提交中,你最终只留下该提交。

解决方案

有多种方法可以解决这个问题,但我将仅解释我认为最常见且可能与更复杂情况兼容的方法。

如何通过重写整个历史记录来创建 AAA 子仓库
  1. 在本地克隆你的仓库,并只使用克隆版本。
  2. 删除最后一次提交,即你手动将文件分成 AAABBB 的提交。
  3. 编写一个(shell)脚本,用于删除不应该是 AAA 部分的所有文件,例如使用:

    git rm --cached --ignore-unmatch "${fileName}"
    
  4. 使用此脚本重写历史中的每个命令,类似于:

    git filter-branch --prune-empty --index-filter "myCleanupScript.sh" HEAD
    

    (注意:这最后一步可能需要很长时间!)


0
你是否使用了“git mv”命令来重构现有目录?你是如何将文件从一个目录复制到另一个目录的?

在IntelliJ中,据我所知,Git应该会自动跟踪重命名。我认为git mv没有做任何特殊的事情。 - ThanksBro

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