我正在尝试使用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 log
的master
和oldstuff/master
(或者trunk
和olstuff/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 - 这个解决方案我根据我的需求从我在这里找到的(我无法让他的移植方法为我的存储库工作 - 但使用替换似乎工作得很漂亮).
归档时间: |
|
查看次数: |
3393 次 |
最近记录: |