【问题标题】:split repo using git filter-branch: how to recover history from renamed/moved files?使用 git filter-branch 拆分 repo:如何从重命名/移动的文件中恢复历史记录?
【发布时间】:2011-05-27 13:18:15
【问题描述】:

免责声明:我见过Detach (move) subdirectory into separate Git repository,但它并没有完全回答问题。

我已经将一个项目从 svn 迁移到了 git。当它存在于 svn 中时,一些文件被移动和/或重命名。

在 git 迁移之后,一些提交只有 git log --follow 可见

所以:

git 结构如下:

MyMainRepo/
.git/
XYZ/
ABC/myFile.txt

git log ABC/myFile.txt 显示: - 提交1 - 提交2

git log --follow ABC/myFile.txt 显示: - 提交1 - 提交2 - commit3 (ABC 目录当时不存在) ...

现在,当拆分 git repo 以具有不同的 ABC git repo 时: git log --follow ABC/myFile.txt 现在失去了旧的历史,而我只有:

  • 提交1
  • 提交2

我想要什么:

  • 从 MyMainRepo 拆分 ABC,
  • 不丢失历史记录

欢迎任何帮助:)

【问题讨论】:

    标签: svn git history git-filter-branch


    【解决方案1】:

    我刚遇到同样的问题,即使使用 index-filter,也无法获得移动文件夹的完整历史记录。

    我的解决方法是对在移动之前已移动的文件夹 (ABC) 进行单独的子目录导出,然后将此存储库的历史移植到新的存储库中。

    假设 ABC 曾经被称为 MNO。我克隆了 MyMainRepo,重置为 MNO 仍然存在的版本(在重命名为 ABC 之前)。我用 subdir 做了一个过滤器分支来获取一个名为“MNO”的存储库。

    在 ABC 内部,我做了一个git fetch ../MNO

    然后我输入将内容移入 ABC 时的提交(这将是 repo ABC 中内容的第一次提交)加上 MNO repo 中的最后一次提交到.git/grafts

    现在我可以在 ABC 中对文件进行 git 登录,并查看一直跟踪到 MNO 中的历史记录。下一步是做另一个过滤器分支,使其成为永久移植物,等等。我制作了一个截屏视频,演示了这里的移植物(尽管上下文有点不同):

    http://blog.tfnico.com/2010/10/gitsvn-6-grafting-together-svn-history.html

    请注意,这必须在每个移动的文件夹的基础上完成,这是很多工作,并且您最终会为每个案例进行合并提交。但是 git log 有效。

    我写这篇文章有点匆忙,但如果有人有兴趣尝试这种方法,请告诉我,我会尝试澄清一下,并展示一些更具体的例子。

    【讨论】:

      【解决方案2】:

      也许不是子目录过滤器,而是具有类似于您的日志评估配方的索引过滤器将是您在历史中遵循重命名所需要的。我有一个working example of an index filter heredocumentation for how to use it here

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 2018-09-02
      相关资源
      最近更新 更多