当主干移动时,如何在Git中保留SVN历史记录?

Eri*_*eim 15 svn git-svn

我正在尝试使用svn2git将SVN项目迁移到git.但是我在保留所有历史方面遇到了问题.原因似乎是因为行李箱过去被移动了.我使用的命令是:

$ svn2git http://mysvnserver.com/myproject/iPhone/ --no-minimize-url --authors ../authors.txt
Run Code Online (Sandbox Code Playgroud)

但这只能让我的历史可以追溯到2011年.该项目实际上始于2010年.预计开始时看起来像这样:

myproject
   trunk
   branches
   tags
Run Code Online (Sandbox Code Playgroud)

但在2011年,它改为:

myproject
   iPhone
     trunk
     branches
     tags
   Android
      trunk
      branches
      tags
Run Code Online (Sandbox Code Playgroud)

旧的主干和分支都在iPhone目录下.我从这一举动完成后开始的历史.如果我svn log在iPhone目录中,我会得到缩短的历史记录.但如果我,cd trunk; svn log那么我得到了完整的历史.

我不知道如何将这段历史记录下来.我的想法是以某种方式创建一个git存储库,只有中继的历史可以追溯到2010年.然后我会把它作为我的主仓库中的一个分支拉出来,然后做一个rebase以使历史记录正确.但我没有运气为主干创造这个回购.我试过了:

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk --authors ../authors.txt
Run Code Online (Sandbox Code Playgroud)

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk -no-minimize-url --authors ../authors.txt
Run Code Online (Sandbox Code Playgroud)

没有任何成功.

Sha*_*Man 15

我自己也遇到了同样的问题.这是我如何解决它.

分别克隆两个回购.

git svn clone -s [original-svn-location] [original-clone-directory]
git svn clone -s [new-svn-location] [new-clone-directory]
Run Code Online (Sandbox Code Playgroud)

将旧的克隆数据添加到新的repo.

cd [new-clone-directory]
git remote add oldstuff ../[original-clone-directory]
git fetch oldstuff
Run Code Online (Sandbox Code Playgroud)

现在棘手的问题...不要git logmasteroldstuff/master(或者trunkolstuff/trunk-无论你将它设置),并写下了第一个来自新克隆提交的SHA最后从旧克隆提交莎(之前的举动) .

git replace [first-commit-sha-from-new-clone] [last-commit-sha-from-old-clone]
Run Code Online (Sandbox Code Playgroud)

并重写SHA哈希所以一切都是犹太洁食,你不再需要替换ref ...

git filter-branch
Run Code Online (Sandbox Code Playgroud)

现在要清理不再需要的参考文献.

git remote rm oldstuff
rm -rf .git/refs/replace
Run Code Online (Sandbox Code Playgroud)

您将丢失历史记录中的第一个提交,但由于这应该是初始移动(即:没有实际文件内容已更改),因此对您来说可能无关紧要.

现在所有的历史记录仍应保留,git blame报告会记住回购的旧历史,再次为您提供准确的信息.

您应该能够根据需要经常重复此操作(取决于项目更改其根位置的次数和/或移动的两侧提交了多少个分支).

PS - 这个解决方案我根据我的需求从我在这里找到的(我无法让他的移植方法为我的存储库工作 - 但使用替换似乎工作得很漂亮).