1. 程式人生 > >git管理svn基本操作

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

 的時候,你實際是在與 Subversion 互動,Git 比它要高階複雜的多。儘管可以在本地隨意的進行分支和合並,最好還是通過衍合保持線性的提交歷史,儘量避免類似與遠端 Git 倉庫動態互動這樣的操作。避免修改歷史再重新推送的做法,也不要同時推送到並行的 Git 倉庫來試圖與其他 Git 使用者合作。Subersion 只能儲存單一的線性提交歷史,一不小心就會被搞糊塗。合作團隊中同時有人用 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 會出現錯誤。 這時應該按以下步驟操作:

  1. 手動修改衝突檔案,修改完成後git add

  2. git rebase --continue

  3. 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

  1. 刪除svn目錄svn rm <svntag路徑> -m <commit資訊> 示例:svn rm file:///d/Projects/svn_repo/tags/v1.1 -m 'rm tag'

  2. 刪除遠端跟蹤分支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 伺服器通訊的狀態。