簡介
svn和git都是常用的版本管理軟體,但是git無論在理念或是功能上都比svn更為先進。但是有的公司是以svn作為**倉庫,這時git與svn**的同步就可以通過 git-svn這個軟體進行,從而用git管理svn**。最後的效果相當於把svn倉庫當作git的乙個remote(遠端倉庫),而你本地的**都是通過git來管理,只有push到svn時才會把你本地的commit同步到svn。
從svn轉殖
首先看一看用於測試的svn專案結構,svn的倉庫路徑是
file:///d/projects/svn_repo
,可以用
svnadmin create svn_repo
命令新建。該倉庫有2個分支,1個tag,屬於svn標準布局。
svn專案結構:
1 234
5678
910
1112
13/d/proj1
├── branches
│ ├── a
│ │ └── readme.txt
│ └── b
│ ├── 11.txt
│ └── readme.txt
├── tags
│ └── v1.0
│ ├── 11.txt
│ └── readme.txt
└── trunk
└── readme.txt
命令格式:
git svn clone
相當於git clone
示例:
git svn clone file:///d/projects/svn_repo proj1_git -s --prefix=svn/
引數說明:
如果你的主幹(trunk,相當於非分布式版本控制裡的master分支,代表開發的主線),分支(branches)或者標籤(tags)以不同的方式命名,則應做出相應改變。
-s引數其實是
-t trunk -b branches -t tags
的縮寫,這些引數告訴git這些資料夾與git分支、tag、master的對應關係。
現在,看下用git-svn轉殖的專案情況(執行git branch -a),此處git的分支情況是與svn資料夾對應的。
1 234
5* master
remotes/svn/a
remotes/svn/b
remotes/svn/tags/v1.0
remotes/svn/trunk
命令:git svn clone -r《開始版本號》:《結束版本號》
示例:git svn clone -r2:head file:///d/projects/svn_repo proj1_git -s
工作流程
簡單來說就是,首次新建分支會記錄和svn遠端對應分支的追蹤關係,之後你的所有commit都是在本地的;並且和純git管理的專案沒有區別,只是在
git svn rebase
和git svn dcommit
的時候才會和svn倉庫發生關係
一般工作流程(推薦)
新建分支
git checkout -b 《本地分支名稱》 《遠端分支名稱》
示例:git checkout -b a svn/a
說明:此處新建了乙個本地分支a,與svn的a分支對應。
在本地工作,commit到對應分支上
git svn rebase
從svn上更新**, 相當於svn的update。
git svn dcommit
提交你的commit到svn遠端倉庫,建議提交前都先執行下git svn rebase。
在git本地其他分支工作的情況
git chechout -b a svn/a
此處新建了乙個本地分支a,與svn的a分支對應。
git checkout -b feature1
在a分支的基礎上,開乙個本地feture1分支
在feture1分支進行開發,有了多次commit
在feture1分支上進行
git svn rebase
和 git svn dcommit
,這樣feature1的commit也會提交到svn的a分支上。
需要注意的是要記住feture1是從哪個分支checkout的,它的svn遠端分支就與哪個相同。比如此處是a分支,那麼svn分支就是svn/a,commit就會提交到svn的a分支。
svn分支管理
新建分支到svn
命令:git svn branch 《分支名稱》
示例:git svn branch c_by_git
說明:在svn倉庫上建了了乙個c_by_git分支
分支情況
1 234
56
7a * master
remotes/svn/a
remotes/svn/b
remotes/svn/c_by_git
remotes/svn/tags/v1.0
remotes/svn/trunk
刪除svn分支
示例:svn rm file:///d/projects/svn_repo/branches/c_by_git -m 'rm branch'
示例:git branch -d -r svn/c_by_git
svn上tag管理
新建tag
命令:git svn tag
示例:git svn tag v1.1
說明:在svn倉庫上建了乙個v1.1tag
刪除tag
刪除svn目錄
svn rm
示例: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 svn rebase 會出現錯誤。
這時應該按以下步驟操作:
手動修改衝突檔案,修改完成後
git add
git rebase --continue
git svn dcommit
svn不遵循規範的情況
以上講的都是svn倉庫是標準的情況,如果不標準,則以下幾個地方都會有所不同。
主要就是每個步驟基本都要新增svn的具體路徑。
先看看,示例專案的結構,倉庫路徑是
file:///d/projects/svn_repo2
。這個專案主分支是dev資料夾,branch1和tag1資料夾分別代表的是乙個分支和tag。
svn專案結構:
1 234
56
7/d/proj2
├── branch1
│ └── file1.txt
├── dev
│ └── file1.txt
└── tag1
└── file1.txt
從svn轉殖
命令:git svn clone
示例:git svn clone file:///d/projects/svn_repo2/dev proj2_svn
新增遠端分支資訊
命令:git config --add svn-remote.《遠端分支名稱》.url
git config --add svn-remote.《遠端分支名稱》.fetch :refs/remotes/《遠端分支名稱》
示例:git config --add svn-remote.svn/branch1.url file:///d/projects/svn_repo2/branch1
git config --add svn-remote.svn/branch1.fetch :refs/remotes/svn/branch1
說明:此處的「遠端分支名稱」可以隨意填寫,只要這三個保持一致即可。建議都給他們增加
svn/
字首,這樣svn的所有分支顯示起來會比較一致,與上面clone時的
--prefix=svn/
類似。新建本地分支,與svn對應
命令:git svn fetch 《遠端分支名稱》
獲取svn倉庫該分支的**
git checkout -b 《本地分支名》 《遠端分支名稱》
示例:git svn fetch svn/branch1
git checkout -b branch1 svn/branch1
分支情況:
1 234
* branch1
master
remotes/git-svn
remotes/svn/branch1
GIT與SVN的區別以及SVN轉GIT
公司部分專案開始使用的svn,需要通過svn轉成git,通過查詢可以用git的svn命令,不過在培訓時候找到一些svn與git的區別 分布式檔案系統,每個人都有完整的 分支對svn來說是完整目錄,建立分支需要重新配置,git建立分支相當簡單 git可以離線檢視log日誌 svn提交實際提交到 倉庫,...
svn遷移到git倉庫的方案
svn遷移到git倉庫並保留commit歷史記錄 最近公司要求將 庫從svn遷移到gitlab,由於之前一直是由svn做版本控制。最簡單的方式是將svn的內容export出來,然後新增到gitlab即可。但是,如果svn用的時間很長了,而且很多commit,所以就希望儲存svn commit的資訊以...
上傳專案到svn和git流程
一 1.從本地匯入 到伺服器 第一次初始化匯入 二 1 首先在coding建立專案,建立後再 獲取訪問的https 2 轉殖 cd workspace 找個放空專案的地方 git clone 轉殖 3 把現有的專案檔案拷貝到轉殖下來的資料夾內 4 提交 cd projectname 轉到專案資料夾下...