svn 轉git ,專案配置方案

2021-08-19 04:03:55 字數 4714 閱讀 9178

簡介

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 轉到專案資料夾下...