使用git filter-branch拆分repo:如何从重命名/移动的文件中恢复历史记录?

时间:2010-12-18 12:26:50

标签: svn git history git-filter-branch

免责声明:我见过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显示: - commit1 - commit2

git log --follow ABC/myFile.txt显示: - commit1 - commit2 - commit3(那时ABC目录不存在) ...

现在,当拆分git repo以获得一个独特的ABC git repo时: git log --follow ABC/myFile.txt现在已经失去了历史,我只是:

  • commit1
  • commit2

我想要的是什么:

  • 从MyMainRepo拆分ABC,
  • 不会失去历史

欢迎任何帮助:)

2 个答案:

答案 0 :(得分:1)

我刚遇到同样的问题,即使使用索引过滤器,也无法获得已移动文件夹的完整历史记录。

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

让我们说ABC过去被称为MNO。我克隆MyMainRepo,重置为MNO仍然存在时的版本(在重命名为ABC之前)。我用subdir做一个filter-branch来获取一个名为“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工作。

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

答案 1 :(得分:0)

您可能需要在历史记录中重新命名,而不是使用子目录过滤器,而是使用与日志评估类似的配方的索引过滤器。我有一个working example of an index filter heredocumentation for how to use it here