一、svn直接导出到git master中(推荐)
进入需要导出目录的上一级目录
git svn clone http://PATHTOSVN
# git svn clone http://xxx.xxx.xxx.xxx:8443/svn/projectName
有了这一步就可以在命令行像操作Git一样操作SVN了。如果对git-svn的命令不习惯,可以试试用工具。
# 关联远程git库
git remote add origin http://xxx/xxx.git
# 推送代码到 git master分支
git push -u origin master
未跟踪历史处理
当前所在分支为master
git pull origin master --allow-unrelated-histories
# 合并dev分支代码到master
git merge dev
# --allow-unrelated-histories
git merge dev --allow-unrelated-histories
二、已有代码合并svn历史
分支
(*)master
git-svn
1.拉取代码
git clone https://xxxx
2. git svn clone
# 进入所在项目上一级目录
cd gitProject/..
# 创建git-svn分支, 会在此目录下创建一个git-svn分支
git svn clone http://PATHTOSVN
2. 合并 git-svn到master
2.1 以git-svn为准
从 master 将代码合并到 git-svn
git checkout master
git merge git-svn --allow-unrelated-histories
# 提交代码到 git 库
git commit -m "svn log"
git push -u origin master
2.2 以master为准
从 master 将代码合并到 git-svn
# git merge master
# 历史记录合并
git merge master --allow-unrelated-histories
git checkout master
git merge git-svn
git commit -m "svn log"
git push -u origin master
参考
我的svn迁移到git
折腾了一段时间,还是决定迁移到Git和Hg。
我的迁移命令序列
0 建立authors.txt文件,代码作者的名称对应表
svnuser = gituser <gituser@gmail.com>
1 导入典型结构的svn库
git svn clone svn://localhost/svn -s --authors-file=authors.txt --no-metadata repo.git
//由于是永久性迁移,所以此处用了--no-metadata,如果未来还需要互操作,建议不使用。
2 进入库
cd repo.git
3 导入忽略列表
git svn show-ignore > .gitignore
4 移动远程标签到本地
cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
rm -RF .git/refs/remotes/tags
5 移动远程分支到本地
cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes
基本完成
剩下的可选操作包括
a.添加远程库,并推
git remote add origin https://localhost/git
git push remotes --all
有时候可能还需要
git push --tags
b.压缩库
git gc
c 导入非典型结构的svn库
git svn clone svn:://localhost --authors-file=authors.txt --no-metadata repo.git
d 导入忽略列表并以.gitignore形式建立新的列表
git svn create-ignore
//会在每个目录内添加.gitignore文件,并且自动添加相应内容
或者
git svn show-ignore > /info/exclude
//会将忽略列表添加到exclude文件中,但exclude作用仅限本地
如果报告错误
config --get svn-remote.svn.fetch :refs/remotes/git-svn$: command returned error: 1
则可以通过指定分支解决
git svn show-ignore -i trunk > .gitignore