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

时间:2013-06-21 06:35:22

标签: git git-filter-branch git-rewrite-history

我有这种情况。

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

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

问题是,在我关注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 :(得分:0)

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

答案 1 :(得分:0)

问题

如果我理解正确,您的总git历史记录中有3个文件夹: src AAA BBB 。 基本上是洞历史,你只有 src ,最后你做了一次提交,你把文件从 src 分成 AAA 和< em> BBB ,从而删除 src ,并创建另外两个。

在原理图历史记录视图中(每行是提交,最新/最新提交在顶部,如在gitk中):

AAA, BBB
src
src
src
src
.
.
.

如果您现在使用git filter-branch --prune-empty -subdirectory-filter AAA, 它将删除历史记录中不在文件夹 AAA 内的每个提交的所有内容(然后使 AAA 成为新的根目录)。由于文件夹 AAA 仅存在于历史记录中的单个提交中,因此您只能使用此单一提交。

解决方案

有多种方法可以解决这个问题,但我只会解释一下我认为最通用的方法,而且可能与更复杂的情况最兼容。

如何通过重写整个历史记录来创建AAA子仓库
  1. 本地克隆您的repo,仅使用克隆
  2. 删除您手动将文件分为 AAA BBB 的最后一次提交。
  3. 编写一个(shell-)脚本,删除所有不应属于 AAA 的文件,例如使用:

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

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

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

相关问题