项目如何从 SVN 迁移到 Git
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
#0 系列目錄#
- 版本管理
- SVN版本管理:場景命令實(shí)戰(zhàn)
- SVN版本管理:兩種開發(fā)模式
- GIT版本管理:場景命令實(shí)戰(zhàn)
- GIT版本管理:Git Flow模型
- 項(xiàng)目如何從 SVN 遷移到 Git
很多有點(diǎn)歷史的項(xiàng)目,都是用的 Subversion 作為版本控制工具的,隨著項(xiàng)目需要,很多團(tuán)隊(duì)就打算采用 Git 作為替代工具了。好,現(xiàn)在問題來了:項(xiàng)目如何平滑的從 Subversion 遷移到 Git。
這里所謂的遷移是按照版本控制要求來遷移,包括:
盡可能完整的由誰提交的代碼、做出的代碼變更記錄,提交日志等。
盡可能完整的分支、標(biāo)簽等。
因?yàn)楫吘故遣煌陌姹究刂乒ぞ?#xff0c;轉(zhuǎn)化過程難免會(huì)有瑕疵。
#1 準(zhǔn)備環(huán)境# 安裝用到的工具的軟件包,這里以 Ubuntu 為例:
$ sudo apt-get install subversion git $ sudo apt-get install git-core libsvn-perl perl libterm-readkey-perl#2 規(guī)范 Subversion# 確認(rèn)項(xiàng)目的 Subversion 地址:
# 后面統(tǒng)一用 $PROJECT 表示項(xiàng)目的 Subversion 地址 # 這里的示例項(xiàng)目名稱是 west https://scms.example.com/svn/projects/west/規(guī)范項(xiàng)目在 Subversion 的目錄結(jié)構(gòu):
標(biāo)準(zhǔn)的 trunk、branches、tags 目錄布局。
branches 和 tags 目錄下的分支和標(biāo)簽保持平級(jí),例如:
tags/v1.0.0 可以。
tags/1.x/v1.0.0 多了層目錄就不可以。
如果不是平級(jí),以 tags 為例,先執(zhí)行 svn mv 操作。
方式 1 - 遠(yuǎn)程 svn mv
$ svn mv $PROJECT/tags/1.x/v1.0.0 $PROJECT/tags/v1.0.0方式 2 - 本地 svn mv
$ svn co $PROJECT west_subversion $ cd west_subversion $ svn mv tags/1.x/v1.0.0 tags/v1.0.0最后規(guī)范后的目錄示例如下:
west ├── trunk │ ├── docs │ ├── west │ ├── setup.py │ └── README.rst ├── branches │ ├── hotfix_add_user_error │ ├── hotfix_issuse_9527 │ ├── feature_unittest4app │ └── feature_multi_add_user └── tags├── v1.0.0├── v1.0.1├── v2.0.0└── v2.1.0#3 生成提交者 ID 和郵箱#
- example.com代表組織的郵箱,比如:knownsec.com
- 但如果個(gè)人郵箱不是統(tǒng)一的組織的話,就需要手工編輯 users.txt 了
svn log $PROJECT --xml | grep -P "^<author" | \sort -u | perl -pe 's/<author>(.*?)</author>/$1 = $1 <$1@example.com>/' > users.txt
#4 遷出項(xiàng)目代碼(git svn)#
git svn clone $PROJECT --authors-file=users.txt --no-metadata --localtime --stdlayout--authors-file 是得到的 git log 提交記錄映射好提交者的信息;
--no-metadata 是得到的 git log 不帶上對(duì)應(yīng)的 Subversion 信息了,更干凈;
--localtime 是得到的 git log 以本地時(shí)間為準(zhǔn),建議用上;
--stdlayout 是先前準(zhǔn)備的按規(guī)范目錄風(fēng)格來遷出代碼;
#5 轉(zhuǎn)化成Git的倉庫格式(tags 和 branches)# 處理 tag:
git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done處理 branch:
git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done#6 一些清理工作# 由于這個(gè)轉(zhuǎn)化會(huì)將及歷史上的 branches 和 tags 也都生成一個(gè) Git 的分支和標(biāo)簽,所以還是得清理下你認(rèn)為不用的分支和標(biāo),可能包括:
Subversion 歷史上錯(cuò)誤的 tags。
Subversion 歷史上臨時(shí)的 branches。
冗余的 trunk 分支(其實(shí)跟轉(zhuǎn)化后的 Git master 分支一樣)。
#7 添加到遠(yuǎn)程 Git 倉庫#
- 比如:GitHub 上創(chuàng)建項(xiàng)目 west
- 添加本地 Git 項(xiàng)目到剛創(chuàng)建的遠(yuǎn)程 Git 倉庫
#8 完成遷移# 這樣,可以直接在 Git 下來繼續(xù)你的項(xiàng)目了。
git clone git@github.com:akun/west.git#9 遺留問題# 上述方式轉(zhuǎn)化其實(shí)還有瑕疵,比如:
Subversion 允許空目錄,轉(zhuǎn)化 Git 用 git svn,處理空目錄帶上 --preserve-empty-dirs 可能會(huì)報(bào)錯(cuò),不處理,可能項(xiàng)目的程序原先依賴空目錄的處理就得修改。
類似 svn:externals,svn:ignore,svn:merge 等屬性丟失
不過問題不大,可以接受,Subversion 遷移 Git 算是基本平滑遷移。
轉(zhuǎn)載于:https://my.oschina.net/xianggao/blog/667048
總結(jié)
以上是生活随笔為你收集整理的项目如何从 SVN 迁移到 Git的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 正则使用笔记
- 下一篇: zabbix2.2升级到zabbix3.