關於git 和 svn 的協作
寫在前面:
-
本文是基於git命令進行展開介紹的,window上的圖形化操作tortoiseGit ,也可以圖形化完成下方的介紹,思路相同,操作更簡單,對應的按鈕選單都有,不在贅述
-
本文僅提供指導和介紹,如果遇到文中未遇到的場景或問題,請自行實踐驗證後再進行實際的操作,百度,google,bing等等
-
實踐,很關鍵,命令列提示資訊很關鍵
-
當然,最後,你要先會git,明白原理,知道分支用法,才能更好的理解git svn;
一、背景
由於公司的程式碼庫,現在並行有2種,svn和gitlab,但是大家都懂得,一旦你習慣了git的工作模式,就很難回去了,每次使用svn就想新建個分支,自己搞一搞,什麼之類,也因此給測試人員帶來了麻煩(被吐槽o(╯□╰)o),基於遇到問題,解決問題的 的探索精神,決定研究一下git本身提供給我們的聯動工具;
二、git-svn 介紹
- 1、介紹
英文ok的同學可以直接看這裡, 官方git-svn
簡單說一下:git-svn 是git 提供的一個雙向操作的方式,即可以通過它將svn上的程式碼納入到git的管理,同時在本地使用git操作程式碼,最後將最終要提交到svn的程式碼,通過相關的命令從git庫中提交到svn庫中;
- 2、操作步驟:
2.1、操作命令總述
- 2.1.1、 相關的命令說明
序號 | 命令 | 說明 |
---|---|---|
1 | git svn clone (svn倉庫) | 從svn端clone一個git倉庫到本地 |
2 | git svn rebase | 同步svn程式碼修改到本地分支 |
3 | git svn dcommit | 提交本地修改到svn |
4 | git add (./changed file) | 將修改納入到暫存區 |
5 | git commit | 提交暫存區的修改到倉庫 |
6 | git stash | 提交程式碼到快取佇列 |
7 | git stash apply | 應用快取佇列中的快取資料到本地 |
8 | git branch (分支名稱) | 新建分支 |
9 | git checkout (分支名稱) | 檢出分支 |
- 2.1.2、操作思路總述
- 1、使用git svn 在本地clone 一個受git 管理的倉庫
- 2、在本地進行程式碼的修改和其他變動[就是在git的倉庫下的操作],注意分支
- 3、將最終修改的程式碼,提交到svn端
個人建議:
(1) 少量修改可以嘗試,使用git的stash暫存修改程式碼,同步svn端的變動之後,之後還原修改,再同步到svn ----> 對應練習場景三
(2) 如果是大量變動,建議保持master分支的乾淨,保持只有master於svn 同步(即,只在master分支上,執行相關的git svn 命令),在單獨的開發分支,進行開發,最終 merge 或 rebase 修改到 master 分支(注意:合併之前先同步svn端的更新),然後同步到svn;----> 對應練習場景四
注意:合併之前先同步svn端的更新
注意:合併之前先同步svn端的更新
注意:合併之前先同步svn端的更新
重要的事情說三遍!!!
- 2.1.3、 一些練習場景,可以本地模擬場景進行練習,熟悉後可以對照自身需要,進行套用
寫在前面
- 1、下方場景有前提,請閱讀場景說明
- 2、下方練習場景,可能對應你實際應用中的不太場景下的操作,請思考匹配使用
- 3、如果遇到其他問題,請閱讀相關的命令列說明,自行解決或百度(可能會遇到記錄同步時的,記錄不匹配的問題,可能需要 使用git rebase 命令,詳細根據具體場景,自行根據命令列分析)
場景1: 新建一個Git svn 庫,然後提交修改的程式碼 「注意」此種操作場景比較理想,這裡假設的是svn 端在修改期間沒有新的人提交修改。
// 先從svn上選一個地址,通過git svn 命令clone到本地
git svn clone (一個svn倉庫地址)
// 在本地修改內容,並提交
git add ./changed file
git commit -m "說明文字"
// 使用git-svn命令將修改提交到svn庫
git svn dcommit
複製程式碼
場景2:clone 倉庫過了一段時間之後,在操作期間是有修改,然後再通過git svn 倉庫修改程式碼;
// 首先 同步 svn 端的修改
git svn rebase
// 更新 了遠端資源之後,在修改本地的相關檔案,並提交
git add ./changed file
git commit -m "說明文字"
// 使用git-svn命令將修改提交到svn庫
git svn dcommit
複製程式碼
場景三: 更改了本地的程式碼,在提交之前 發現端有更新
// 先暫存 本地修改的程式碼到 stash (詳細可以自行百度)
git stash
// 同步 svn端的更新
git svn rebase
// 再從stash 中取出之前儲存的修改
git stash apply
// 如果用衝突,解決衝突,並提交
git add ./changed file
git commit -m "說明文字"
// 使用git-svn命令將修改提交到svn庫
git svn dcommit
複製程式碼
場景四:保持master分支乾淨,master 於svn庫同步交流,在別的分支進行程式碼修改
//基於clone好的倉庫,新建分支修改程式碼
git branch changeBranch
//在 changeBranch分支上進行程式碼修改,並提交
git add ./changed file
git commit -m "說明文字"
// 切換回 master分支,同步svn端的修改
git checkout master
git svn rebase
// 同步完成後,合併changeBranch分支的修改
git merge changeBranch
// 提交最終修改到 svn
git svn dcommit
// 題外話:上述操作完成後,你會發現,分支changeBranch 分支已經沒有用了,可以進行刪除,避免開發迭代後,分支過多而混亂
git branch -d changeBranch
複製程式碼
2.2、示例操作
此處僅僅列出了簡單的場景(練習場景一),其他場景,可以自行根據練習,自行實現
1、使用git-svn clone 一個svn倉庫的地址到本地,例如
git svn clone http://XXXXXXXXXXXXXXXXXXXXXXXX-gitSvn
複製程式碼
如上圖所示,clone下來的工程,會將svn庫中的程式碼記錄也同步帶git庫中(真是貼心方便,(:зゝ∠))
2、在clone到本地的倉庫,進行程式碼的修改並提交
此處命令僅僅是演示,詳細使用需要了解相關的命令然後並操作
// 先修改檔案內容;
git add ./或者檔名
git commit -m "提交內容。。"
// 然後同步修改都svn 端
git svn dcommit
複製程式碼
三、開發模式(個人見解僅供參考)
第一步: 建立倉庫: 使用git svn clone
第二步: 在本地倉庫,建立修改分支 newBranch
第三步: 在修改分支newBranch 修改程式碼, 在master上同步svn上的程式碼
第四步: 完成在修改分支newBranch的開發後,先切回master分支上同步svn的修改
第五步: 在本地合併操作 newBranch的修改到 master分支,
第六步: 解決衝突後,提交master上的修改到svn端;
四、注意事項
- 1、注意保持於svn端同步的分支的乾淨,一般是master分支;
- 2、注意於svn端程式碼的同步時機,上方以強調,不贅述了
- 3、注意分支的管理
- 4、注意命令列的提示資訊
- 5、注意在不確定是什麼現象前,先進行預演或練習