【问题标题】:Git filtering after renaming the folder重命名文件夹后的Git过滤
【发布时间】:2013-06-21 06:35:21
【问题描述】:

我有这种情况。

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

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

问题是,在我关注 Detach (move) subdirectory into separate Git repository 之后,我得到了没有历史记录的分离 git 提交。

0 | 0

我也试过这个How to split a git repository and follow directory renames?

通过将 BBB 和 AAA 放入 Name1 和 Name2 但它不起作用..

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 在 intelliJ 中。据我所知,Git 应该会自动跟踪重命名。我认为 git mv 没有做任何特别的事情。
    【解决方案2】:

    问题

    如果我理解正确,您的 git 历史记录中有 3 个文件夹:srcAAABBB。 对于基本的漏洞历史,你只有 src,最后你做了一个提交,你将文件从 src 分成 AAA 和 BBB,从而删除 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
      

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

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 2019-07-30
      • 2011-11-04
      • 2016-09-08
      • 2012-04-16
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多