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

5
免责声明:我看到了将子目录(文件夹)分离并移动到单独的Git存储库中,但它并没有完全回答这个问题。
我已经将一个项目从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仓库拆分为独立的ABC git仓库: git log --follow ABC/myFile.txt 现在丢失了旧的历史记录,只剩下:

  • commit1
  • commit2

我想要的是:

  • 将ABC从MyMainRepo中拆分出来,
  • 不要丢失历史记录。

欢迎任何帮助 :)

2个回答

1

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

我的解决方法是在移动文件夹(ABC)被移动之前的某个时点,对该文件夹进行单独的子目录导出,然后将此仓库的历史记录嫁接到新仓库中。

假设ABC以前叫做MNO。我克隆MyMainRepo,重置为MNO仍然存在的版本(在它被重命名为ABC之前)。我使用子目录进行筛选,得到一个名为"MNO"的仓库。

在ABC内,我执行git fetch ../MNO

然后我输入当内容移动到ABC时的提交(这将是存储库ABC中的第一个提交)和MNO存储库中的最后一个提交,加入到.git/grafts中。

现在,我可以在ABC中的文件上执行git log,并查看其历史记录,追溯到MNO中的情况。下一步是执行另一个筛选分支,使其成为永久性的嫁接等。我做了一个演示嫁接的视频(尽管上下文有些不同):

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

请注意,这必须基于每个移动的文件夹进行操作,这是很多工作,并且您最终会得到每种情况的合并提交。但是git log可以工作。
我有点匆忙地写这篇文章,但如果有人有兴趣尝试这种方法,请告诉我,我会尽力澄清一些内容,并展示更多具体的例子。

0

似乎现在位于https://github.com/githubtraining/git-workshop/tree/master/examples/filter-branch。 - Jake Wharton
现在可能已经移动到https://github.com/github/teach.github.com/tree/gh-pages/examples/filter-branch,但实际上并不清楚,因为原始答案没有提供关于其示例用法的太多细节。 - pnkfelix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接