git管理svn基本操作
簡介
當前,大多數開發中的開源專案以及大量的商業專案都使用 Subversion 來管理原始碼。作為最流行的開源版本控制系統,Subversion 已經存在了接近十年的時間。它在許多方面與 CVS 十分類似,後者是前者出現之前程式碼控制世界的霸主。
而在分散式版本控制系統中,Git逐漸佔據了上風,目前,國外最大的社交程式設計及程式碼託管網站Github,Bitbucket,Gitlab,國內的碼雲、Coding、華為軟體開發雲(DevCloud)中的配置管理等程式碼託管平臺均支援Git。Git是一款免費、開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。Git是Linus Torvalds為了幫助管理Linux核心開發而開發的一個開放原始碼的版本控制軟體。Torvalds 開始著手開發 Git 是為了作為一種過渡方案來替代 BitKeeper,後者之前一直是Linux核心開發人員在全球使用的主要原始碼工具。開放原始碼社群中的有些人覺得BitKeeper 的許可證並不適合開放原始碼社群的工作,因此Torvalds決定著手研究許可證更為靈活的版本控制系統。儘管最初Git的開發是為了輔助Linux核心開發的過程,但是我們已經發現在很多其他自由軟體專案中也使用了Git。
而隨著擁有分散式版本控制系統優勢的Git的快速發展,越來越多的開發者準備從集中式版本控制系統SVN遷移到Git上,這其中,Git相對SVN表現出來的更有利於開發者版本控制管理的特點自然是最重要的原因。
掌握了Git 再去學習其他的版本控制相對容易,所以我個人也很偏向大家先開始學習Git。
今天的正題是如何在Git中管理SVN庫,在Git官方文件中有明確的說明了使用 git svn 命令,接下來讓我們來詳細瞭解下該命令。
git svn
Git 中所有 Subversion 橋接命令的基礎是 git svn
。所有的命令都從它開始。相關的命令數目不少,你將通過幾個簡單的工作流程瞭解到其中常見的一些。值得警戒的是,在使用 git svn
從SVN中克隆
命令格式:git svn clone <svn倉庫路徑> [本地資料夾名] [其他引數]
git clone
示例: git svn clone svn://xxxx/svn_project E:\IDE\svn_project
引數說明:
-s
告訴 Git 該 Subversion 倉庫遵循了基本的分支和標籤命名法則,也就是標準佈局。 如果你的主幹(trunk,相當於非分散式版本控制裡的master分支,代表開發的主線),分支(branches)或者標籤(tags)以不同的方式命名,則應做出相應改變。-s
引數其實是-T trunk -b branches -t tags
的縮寫,這些引數告訴git這些資料夾與git分支、tag、master的對應關係。--prefix=svn/
給svn的所有remote名稱增加了一個字首svn,這樣比較統一,而且可以防止warning: refname 'xxx' is ambiguous.
獲取SVN更新內容
命令格式:git svn rebase
一般沒有切換分支預設是直從mater獲取
提交到SVN
一般來說我個人推薦這樣做:
先執行:git commit -m “說明”
在執行:git svn dcommit
這樣做是先提交到本地倉,在統一提交到SVN,原因就是當你還在編碼時你的團隊要執行專案的時候會執行不起來,當然這個也可以用分支來解決這個問題,當讓儲存檔案後也可以直接提交到SVN上,但是這種方式不推薦。
衝突解決
如果本地和svn都進行了修改,則不能快速前進,git svn rebase 會出現錯誤。 這時應該按以下步驟操作:
-
手動修改衝突檔案,修改完成後
git add
-
git rebase --continue
-
git svn dcommit
SVN分支管理
新建分支到svn
命令:git svn branch <分支名稱>
示例:git svn branch c_by_git
說明:在svn倉庫上建了了一個c_by_git分支
分支情況
* master
remotes/svn/a
remotes/svn/trunk
刪除svn分支
- 刪除svn分支目錄
svn rm <svn分支路徑> -m <commit資訊>
示例:svn rm svn://xxx/svn_repo/branches/c_by_git -m 'rm branch'
- 刪除遠端跟蹤分支
git branch -D -r <遠端分支名稱>
示例:git branch -D -r svn/a
SVN上tag管理
新建tag
命令:git svn tag <tag名稱>
示例:git svn tag v1.1
說明:在svn倉庫上建了一個v1.1tag
刪除tag
-
刪除svn目錄
svn rm <svntag路徑> -m <commit資訊>
示例:svn rm file:///d/Projects/svn_repo/tags/v1.1 -m 'rm tag'
-
刪除遠端跟蹤分支
git branch -D -r <遠端分支名稱>
示例:git branch -D -r svn/tags/v1.1
說明:svn的tag和分支在git看來是一樣的,所以此處還是用的git branch
SVN 日誌
同樣,它不顯示本地的 Git 提交以及 Subversion 上後來更新的內容。類似 git svn log
對 git log
的模擬,svn annotate
的等效命令是 git svn blame [檔名]
。其輸出如下:
$ git svn blame README.txt
2 temporal Protocol Buffers - Google's data interchange format
2 temporal Copyright 2008 Google Inc.
2 temporal http://code.google.com/apis/protocolbuffers/
2 temporal
22 temporal C++ Installation - Unix
22 temporal =======================
2 temporal
79 schacon Committing in git-svn.
78 schacon
2 temporal To build and install the C++ Protocol Buffer runtime and the Protocol
2 temporal Buffer compiler (protoc) execute the following:
2 temporal
同樣,它不顯示本地的 Git 提交以及 Subversion 上後來更新的內容。
SVN 伺服器資訊
還可以使用 git svn info
來獲取與執行 svn info
類似的資訊:
$ git svn info
Path: .
URL: https://schacon-test.googlecode.com/svn/trunk
Repository Root: https://schacon-test.googlecode.com/svn
Repository UUID: 4c93b258-373f-11de-be05-5f7a86268029
Revision: 87
Node Kind: directory
Schedule: normal
Last Changed Author: schacon
Last Changed Rev: 87
Last Changed Date: 2009-05-02 16:07:37 -0700 (Sat, 02 May 2009)
它與 blame
和 log
的相同點在於離線執行以及只更新到最後一次與 Subversion 伺服器通訊的狀態。