3

我有这种情况。

我正在将我的存储库重构为两个 src 文件夹,以便我可以使用 git filter-branch 拆分文件夹。

所以我创建了 AAA 和 BBB 文件夹而不是 src

问题是,在我按照分离(移动)子目录进入单独的 Git 存储库后,我得到了没有历史记录的分离 git 提交。

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

我也尝试过如何拆分 git 存储库并遵循目录重命名?

通过将 BBB 和 AAA 放入 Name1 和 Name2 但它没有工作..

对此有任何帮助,我知道可以做到:)

4

2 回答 2

0

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

于 2013-07-23T12:21:33.533 回答
0

问题

如果我理解正确,您的 git 历史记录中有 3 个文件夹: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
    

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

于 2015-06-12T06:06:16.647 回答