2016-12-12

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

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

建議流程

一. 從 SVN 取得 source code
將 source code 從 SVN 取出,並改由 GIT 管理
二. 建立 feature branch
每次修改前,都建立分支
三. 修改 --> commit
每次修改後,就留下版本紀錄
四. 確定完成 --> merge 到本機 git-svn repository
確認版本後,就將 feature branch merge 回一開始從 SVN 取回的 master branch 中
五. 儲存到 SVN
dcommit(push) 到 svn
六. 刪除 feature branch
將 feature branch 刪除,每次修改都建立 branch

一. 從 svn 取得 source code

使用指令

git svn clone {svn_repository_url} {資料夾名稱}
  1. 沒有指定 資料夾名稱--> 預設使用專案名稱當作資料夾名稱 git svn clone https://svnserver/svn/TestGitSvn
    • 會建立專案名稱資料夾,並將 source code 下載至 專案名稱資料夾中
      gitsvn1
  2. 指定 資料夾名稱 svn clone https://svnserver/svn/TestGitSvn/ test
    • 會建立test資料夾,並將 source code 下載至 test
      gitsvn2

使用 TortoiseGit

  1. git-clone
    • 資料夾空白處,按右鍵 --> Git Clone
      gitclone1
  2. from svn
    gitclone2
  • 2-1. URL
    SVN url
  • 2-2. Directory
    目標目錄
  • 2-3. From SVN Repository
    表示從 SVN 下載,相關下載屬性也在這個區塊設定

大型專案

檔案數較多或是 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

二. 新增 feature branch

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

使用指令

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

使用 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
    建立分支後,直接將工作目錄,切換過去

三. Git Commit

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

使用指令

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

使用 TortoiseGit

  1. 欲 commit 位置的資料夾 按右鍵 --> Git Commit -> "branchname"...
    gitcommit
  2. Commit
    gitcommit2
  • 2-1. Message
    commit 的註解
  • 2-2. trick Not Versioned Files
    挑選要加入版控的新增檔案

四. merge 到 git svn

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

使用指令

  1. 切換到一開始建立 git repository 的 branch (預設 master)
    git checkout master
  2. 合併分支(merge)
    git merge branchbname

使用 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

五. push 至 SVN

將本機 Git 的變更,存進 SVN

使用指令

  1. 更新版本
    git svn rebase
  2. commit 至 SVN
    git svn dcommit

使用 TortoiseGit

GITSVN
  1. 資料夾右鍵
  2. 點選 TortoiseGit
  3. 點選 SVN DCommit...
    • 預設會執行Git SVN Rebase 進行更新
      committype commited

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

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

使用指令

  1. Rebase
    • git rebase -i HEAD~3
    • HEAD~3 指最近三個 commit
  2. 合併 (squash)
    • 要留下的用 p or pick
    • 要合併的用 s or squash
    • 改完,直接按:wq 存檔離開

使用 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

六. 刪除 featur branch

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

使用指令

git branch -d {branchname}

使用 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 簡單教學

沒有留言:

張貼留言