Local Git Remote SVN(本機使用 Git,版控 Server 使用 SVN)

大家一定或多或少感受到 Git 愈來愈多人採用,為了不輸別人(咦?)應該是為了體會 Git 的過人之處,最好的方式就是開始使用它,但公司的版控豈是說換就換的。這邊簡單紀錄一下個人使用經驗:該如何在版控 server 仍使用 SVN 的前提下,開發人員在開發環境改用 Git 管理。

建議流程

  1. 從 SVN 取得 source code

    將 source code 從 SVN 取出,並改由 Git 管理

  2. 建立 feature branch

    每次修改前,都建立分支

  3. 修改 –> commit

    每次修改後,就留下版本紀錄

  4. 確定完成 –> merge 到本機 git-svn repository

    確認版本後,就將 feature branch merge 回一開始從 SVN 取回的 master branch 中

  5. 儲存到 SVN

    dcommit(push) 到 svn

  6. 刪除 feature branch

    將 feature branch 刪除,每次修改都建立 branch

1. 從 svn 取得 source code (擇一即可)

  • A. 使用指令

    git svn clone {svn_repository_url} {資料夾名稱}
    
    • 沒有指定 資料夾名稱 時,預設使用專案名稱當作資料夾名稱

      git svn clone https://svnserver/svn/TestGitSvn
      
      • 會建立 專案名稱 資料夾,並將 source code 下載至 專案名稱 資料夾中 gitsvn1
    • 指定 資料夾名稱

      svn clone https://svnserver/svn/TestGitSvn/ test
      
      • 會建立 test 資料夾,並將 source code 下載至 test gitsvn2
  • B. 使用 TortoiseGit

    1. clone 專案

      • 資料夾空白處,按右鍵 –> Git Clone gitclone1
    2. from svn gitclone2

      • 2-1. URL

        SVN url

      • 2-2. Directory

        目標目錄

      • 2-3. From SVN Repository

        表示從 SVN 下載,相關下載屬性也在這個區塊設定

  • C. 大型專案 檔案數較多或是 Commit 數量較多的專案

    1. 使用指令

      • 使用 -r HEAD , 只取得最新版

        git svn clone -r HEAD {svn_repository_url} {資料夾名稱}
        
      • 如果中間發生斷線,可以試試git svn fetch*

    2. 使用 TortoiseGit

      • 指定 From

        • 無法像指令指定 HEAD,就挑最後一版

          tgit_from

          tgit_from_done

      • git SVN Fetch

        git_svn_fetch

2. 新增 feature branch

建立 feature branch,僅在本機作業,不會影響 SVN

  • A. 使用指令

    git checkout -b {branchbname}
    
    • -b 會先建立 {branchname} 同時並切換過去,效果等同於下列兩句
      1. git branch {branchbname}
      2. git checkout {branchbname}
  • B. 使用 TortoiseGit

    1. 在欲建立 branch 的資料夾上按右鍵 –> TortoiseGit–> Create Branch

      createbranch

    2. branch 相關屬性

      createbranch1

      • 2-1. Name

        填入 branch name

      • 2-2. Base On

        新分支的來源,預設以目前工作分支,也可以選擇其他分支

      • 2-3. Switch to new branch

        建立分支後,直接將工作目錄,切換過去

3. Git Commit

  • 在本機將變更留下紀錄,其他人不會看到變更,SVN 也沒有這個變更
  • 養成留下版本變更的習慣,也不會讓團隊其他人拿到修改中的版本
  • A. 使用指令

    git commit -a -m 'something'
    
    • -a 是將新增的檔案也納入 commit 範圍,等同於 git add .
    • -m 'something', 是在 commit 時直接給註解
  • B. 使用 TortoiseGit

    1. 欲 commit 位置的資料夾 按右鍵 –> Git Commit -> "branchname"...

      gitcommit

    2. Commit

      gitcommit2

    • 2-1. Message

      commit 的註解

    • 2-2. trick Not Versioned Files

      挑選要加入版控的新增檔案

4. merge 到 git svn

  • 修改已經完成,將 commit merge 到一開始下載的 repository 中,準備儲存到 svn
  • merge 指的是將特定 commit 合併至目前工作目錄分支,所以要留意目前工作目錄的位置
  • A. 使用指令

    1. 切換到一開始建立 git repository 的 branch (預設 master)

      git checkout master
      
    2. 合併分支(merge)

      git merge branchbname
      
  • B. 使用 TortoiseGit

    1. 切換到一開始建立 git repository 的 branch (預設 master)

      • 1-1. git show log

        • 在資料夾按右鍵,選 Git Show Log

          gitlog

      • 1-2. 在 master 上,按右鍵 –> Switch/Checkout to "master"

        checkoutmaster

        checkouted

    2. 合併分支(merge)

      • 2-1. 在欲合併的分支上按右鍵
      • 2-2. 點選Merge to "master"

        mergeto

      • 2-3. option

        • 可以直接使用預設即可

          mergeoption

          mergedone

5. push 至 SVN

將本機 Git 的變更,存進 SVN,使用 dcommit 指令

  • A. 使用指令

    1. 更新版本

      git svn rebase
      
    2. dcommit 至 SVN

      git svn dcommit
      
  • B. 使用 TortoiseGit

    GitSVN

    1. 資料夾右鍵
    2. 點選 TortoiseGit
    3. 點選 SVN DCommit...

      • 預設會執行Git SVN Rebase 進行更新

        committype

        commited

Note: 合併多個 git commit,一次儲存到 SVN

合併多次版本變更,讓 SVN 紀錄相對好閱讀

  • A. 使用指令

    1. Rebase

      git rebase -i HEAD~3
      
      • HEAD~3 指最近三個 commit
    2. 合併 (squash)

      • 要留下的用 p or pick
      • 要合併的用 s or squash
      • 改完,直接按:wq 存檔離開
  • B. 使用 TortoiseGit

    1. Git SVN Rebase

      • 1-1. 資料夾 –> 右鍵 –> TortoiseGit –> Git Rebase

        git_rebase

      • 1-2. 選擇 Squash ALL –> Start Rebase

        Squash

      • 1-3. Commit –> DONE

        REBASECOMMIT

        rebasedone

    2. Combine to one commit

      • 2-1. git show log

        • 在資料夾按右鍵,選 Git Show Log

          gitlog

      • 2-2. 選擇欲合併的 commit –> 按右鍵 –>Combine to one commit

        combine2one

      • 2-3. 修改訊息 –> commit

        combine2one_commit

6. 刪除 featur branch

featur branch 不需推送到 SVN,feature 完成後就可以刪除

  • A. 使用指令

    git branch -d {branchname}
    
  • B. 使用 TortoiseGit

    1. merge 後會提示刪除

      removebranch

    2. branch 管理

      • 2-1. 資料夾右鍵 –> TortoiseGit –> Switch/Checkout..

        switchcheckout

      • 2-2. 選擇其他 branch

        otherbranch

      • 2-3. DELETE

        delete

參考資料

  1. git-svn
  2. 使用 git-svn 工具管理 SVN 專案
  3. 我的 git-svn 用法
  4. git 與 git-svn 簡單教學