學習使用 git-svn

學習使用 git-svn

我想,點擊這篇文章進來的同志們應該都是對 git 和 svn 版本控制工具或多或少都瞭解的。那麼我丟失的對一些基礎知識的說明也就不是那麼必須了。

因爲大部分公司開發的項目多數是使用 Subversion 這樣的版本控制工具的,而作爲16級應屆畢業生,之前被GitHub大潮洗禮過,入職前對於版本控制工具的學習只限於git, 畢業論文的撰寫也是在git的幫助下完成了,所以用自己熟悉的工具當然是最好的了。可是偏偏工作了用不上,鬱悶了一段時間。

對於橢圓非標準方程式,我們通常都是先把它轉化到標準方程後對其進行處理的,我想高考過的人都應該能理解這裏的意思。既然一個環境我們不熟悉,那麼就把它轉化到我們熟悉的環境下進行操作。幸運的是,已經有人做過這方面的工作了, git-svn 就是這樣一個令人振奮的工具。它可以把遠程的Subversion倉庫克隆成本地的git倉庫,讓你在本地操作完全和git環境一模一樣,只是在和遠程倉庫交互時的操作略有不同。

主要的不同之處大概也就是在克隆、下拉、上推這三種操作的調整。

通常一個標準的SVN倉庫目錄結構是這樣的(一般至少包含 trunk、tags、branches目錄):

svn-repo/
├── trunk           項目主幹 相當於 git 倉庫下的 master 分支
├── tags            打tag的項目版本,用於發佈,相當於 git 下的 release 分支 
├── branches        相當於一般的 git 分支, 一般用於新性或模塊的開發工作
├── doc             一般用於存放一些項目開發過程中用到的文檔資料
└── other-dir       一些其它資料存放在這裏,像是開發證書之類的文件

下面以三個例子說明一下大致流程:

基本使用示例:

跟蹤並對一個Subversion託管倉庫的 trunk 目錄貢獻,忽略 tagsbranches 目錄:

#克隆一個倉庫, 類似於 git clone 命令:
    git svn clone http://svn.example/com/project/trunk

# 進入新克隆的本地倉庫目錄:
    cd trunk

# 現在你應該是master分支上,使用 git branch 來確認一下
    git branch

# 之後你可以像通常使用 git 那樣在本地倉庫中進行更改或提交,注意這裏的操作都只是對本地倉庫來說的

    //do some change in your local git repo
    
    git add *
    git commit -m 'something be added to repo for commit'

# 當你想要將本地的更改提交遠程倉庫時, 需要先使用 rebase 命令來同步其它人的工作到本地倉庫中:
    git svn rebase

# 同步遠程倉庫後可能會出現一些衝突,像正常使用git那樣解決衝突後,再使用 git svn rebase 同步倉庫,直到沒有衝突後,就可以使用 git svn dcommit 提交你的更改到遠程倉庫中:
    git svn dcommit

# 你還可以把遠程SVN倉庫中設定的忽略文件設定導入到本地git倉庫的相應設置文件中:
    git svn show-ignore >> ,git/info/exclude

另一個例子是跟蹤並對一個完整的標準SVN倉庫(包括 trunk tagsbranches目錄)貢獻。

# 首先是克隆遠程SVN倉庫到本地git倉庫:
    git svn clone http://svn.example.com/project --stdlayout --prefix svn/

# 如果遠程SVN倉庫使用的目錄結構不是標準的 trunk/tags/branches 形式時,使用:
    git svn clone http://svn.example.com/project -T trunk_dir -b branch_dir -t tag_dir --prefix svn/

# 查看你所克隆的倉庫的所有分支(branches)和標記(tags):
    git branch -r

# 在SVN遠程倉庫中創建一個新的分支:
    git svn branch new-branch-name

# 把git 的 master 分支(或其它分支)設定到 SVN 的 trunk 目錄上:
    git reset --hard svn/trunk
#
# 一次你只能向 branch/tag/trunk 提交一次,使用 dcommit命令
#
# 之後你可以像常使用 git 那樣在本地倉庫中進行更改或提交,注意這裏的操作都只是對本地倉庫來說的
    git commit ...

# 當你想要將本地的更改提交遠程倉庫時, 需要先使用 rebase 命令來同步其它你的工作到你本地倉庫中:
    git svn rebase

# 同步遠程倉庫後可能會出現一些衝突,像正常使用git那樣解決衝突後,再使用 git svn rebase 同步倉庫,直到沒有衝突後,再使用 git svn dcommit 提交你的更改到遠程倉庫中:
    git svn dcommit

# 你還可以把遠程SVN倉庫中設定的忽略文件設定導入到本地git倉庫的相應設置文件中:
    git svn show-ignore >> ,git/info/exclude

當遠程SVN項目非常大時, 使用 git svn clone 來克隆項目會很耗時, 如果多個人想都使用 git svn clone 去克隆同一個遠程倉庫時,可以先讓其中一人使用 git svn clone 把倉庫克隆成git倉庫放在服務器上,然後其它人就可以像克隆git遠程倉庫那樣進行倉庫克隆了。

# 由一個人把SVN遠程倉庫克隆到服務器上:
    ssh server "cd /pub && git svn clone http://svn.example.com/project [options ...]"

# 然後其它人就可以克隆倉庫到本地了:
    mkdir project 
    cd project
    git init
    git remote add origin server:/pub/project
    git config --replace-all remote.origin.fetch '+ref/remotes/*:refs/remotes/*'
    git fetch

# 防止之後再從 Git 服務器上取數據, 因爲克隆下來後,我們之後都是要使用 git svn 來操作遠程SVN倉庫了, 不是之前的那個臨時Git倉庫服務器了
    git config --remove-section remote.origin

# 從之前獲取的遠程分支中創建一個對應的本地分支進行跟蹤:
    git checkout -b master FETCH_HEAD

# 本地初始化 git svn 倉庫就和之前的兩個示例一樣了:
    git svn init http://svn.example.com/project [options ...]

# 從SVN遠程倉庫上拉下最新的數據:
    git svn rebase

如果看完這幾個例子,還是有點不明白,那麼就需要進一步瞭解一下具體涉及的幾個命令的詳細說明了,這裏我只對我自己覺得重要的幾個命令和相關選項作一點翻譯工作。扔個磚頭,引個玉 ~~

git-svn 命令手冊部分翻譯

英文版官方文檔:https://git-scm.com/docs/git-svn

名稱

git-svn - 可以在 SubversionGit倉庫之間進行雙向操作。

梗概

git svn <命令> [選項] [參數]

描述

git svn 是一種可以在 SubversionGit 之間進行互操作的簡單方式。是 SubversionGit 之間操作的橋樑。

git svn 可以使用選項 --stdlayout 對遵循 "trunk/branches/tags/" 目錄結構的標準Subversion倉庫進行跟蹤。它也可以分別使用選項 -T-t-b 來分別跟蹤 trunktagsbranches目錄(參見下面對選項initclone的相關介紹)

如果使用上面所描述的方式跟蹤了一個Subversion倉庫,就可以使用fetch命令從Subversion倉庫中拉取更新,並且使用dcommit命令將git倉庫的變更提交到Subversion倉庫中去。

命令

init

git svn 初始化一個帶有附加元數據目錄(.git/)的空Git倉庫。這個命令需要後面跟上Subversion倉庫的URL地址,或者是對應於Subverison倉庫目錄 trunk(-T)/tags(-t)/branches(-b) 的完整URL。

所要初始化的目標目錄作爲命令的第二個參數是可選的,如果不提供,默認初始化當前目錄。

-T<trunk_subdir> 或 --trunk=<trunk_subdir>

-t<tags_subdir> 或 --tags=<tags_subdir>

-b<branches_subdir> 或 --branches = <branches_subdir>

-s 或 --stdlayout (該命令默認選項)

上面列出的是 init 命令的可選項,每一個都可以賦予指向倉庫目錄的相對路徑 (--tags=project/tags) 或完整URL (--tags=https://foo.org/project/tags)。如果你的Subversion倉庫把tagsbranches放在多個路徑下時,也可指定多個 --tags--branches 選項。--stdlayout 表示你的Subversion倉庫目錄結構是標準的 trunk/tags/branches 形式,與另外的選項一起使用時,--stdlayout選項的優先級最低。

--username=<user>

對於通過 http httpssvn 協議傳輸且需要身份認證的SVN倉庫, 通過該選項指明用戶名。對於通過 svn+ssh 協議傳輸的SVN倉庫,需要把用戶名信息拼接到URL上,例如: svn+ssh://[email protected]/project

fetch

僅從Subvesion倉庫中取回其他人所做的修改的信息,但不對當前工作目錄產生任何影響

--log-window-size=<n>

掃描Subversion歷史時,每次取回的歷史條目數,默認每次請求取回100條歷史。

clone

相當於運行了 initfetch 命令。它會根據所提供的倉庫URL地址的倉庫名稱,自動創建目錄,如果該命令有第二個參數,則按照第二個參數指定的名稱創建目錄並在其中處理相關版本控制任務。它可以接受除了 --fetch-all--parent這兩個選項之外的任何其它可用於 initfetch命令的選項。項目被從倉庫克隆到本地後,可以使用 fetch 命令獲得最近更新信息,但這不會影響當前工作目錄,你需要使用 rebase命令把最新獲取的更新信息應用到當前工作目錄中。

rebase

從 SVN 倉庫中獲得最新更新信息,並應用於當前本地工作目錄。 它與 svn updategit pull 的不同之處在於,它會保證提交歷史的線性特徵,以便於之後使用命令 git svn dcommit 提交。這個命令使用時要求當前工作目錄沒有待提交的更改,也就是當前工作區必須是乾淨的。

-l 或 --local

不拉取倉庫的更新數據,僅僅對本地倉庫作 rebase 操作, 以此來線性化提交歷史。

dcommit

把本地修改推送到SVN倉庫中去, 相當於純svn環境下的 svn commit 的效果。

branch

在SVN倉庫中創建一個新分支

-m 或 --message

指定創建分支時的提交信息

-t 或 --tags
創創建一個tag版本。

tag

相當於 git svn branch -t,即創建一個tag版本

log

以svn的形式查看倉庫歷史提交日誌。

blame

顯示一個文件內每一行最近一次被修改的版本號和修改人的名字。它不會對未提交過後文件內容起作用。

--git-format
git blame 命令的形式顯示相關信息。

info

與純svn環境下的 svn info 使用效果一樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章