2014年5月2日 星期五

git-svn experience sharing - (2).

Description

之前預想的 local git + remote SVN 運作方式,我試了幾天後沒什麼問題,整理一下以實例的方式分享給大家參考,如果有任何更好的方法再請不吝賜教。: )

Environment description:

SVN respository:

SVN://XXX/OOO/branches/myproject

Expected result:

  1. Have a local git repository for track.
  2. Easy to modify for debugging and fixing issues.
  3. Easy to pick up the changes which commonly for debug.

How to?

1. Modify local git configuration file.

在此,我假設已經有一個 local git 存在,且其檔案就如同 SVN 上的一樣。
修改 .git/config

[core]
        repositoryformatversion = 0 
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        hideDotFiles = dotGitOnly
[svn-remote "svn-source"]
    url = svn://XXX/OOO/branches/myproject
    fetch = :refs/remotes/svn-source

其中 [svn-remote "svn-source"] section 以下是自已手動加上去的,原理可看前篇說明。
如此就可以讓 local git 和 remote SVN 產生關聯。

2. Pull SVN updates to local SVN repository (same as git repository).

將 SVN 本地當前版本開始的 commit history information 從 SVN server 抓下來作為 git 認為的 remote repository svn-source,但沒有update 本地檔案,此時使用 #git log可以看到更新過後的 SVN log。這一步可以省略。

#git svn fetch svn-source

將 SVN 本地當前版本開始的 commit history information 從 SVN server 抓下來,並 update 本地檔案。

#git svn rebase svn-source

3. Create a branch to fix issue.

從追綜 SVN trunk 的 local git repository 建 branch for issue 123.

#git checkout -b issue_123

hack… hack… hack…

#git commit

4. Merge back to trunk.

回到 step 2. pull SVN update to local SVN repository,然後就可以把 branch issue_123 的修改 merge 回到追綜 SVN trunk 的 local git repository。

#git merge svn-source

5. Commit.

我是習慣還是用原本的 SVN repository 來 commit,在 merge back 的過程中,也可以再次檢查有沒有寫錯或是多餘的地方。
但 git-svn 也提供直接下 command commit 到 SVN.

#git svn dcommit

Benefit

  1. 方便從SVN 上取出任一版本出來修改驗証。
  2. 方便將修改驗証後的 git branch merge back 到 SVN 中。

Other

  1. 可以在 svn command line 使用 gitk –all 看到所有 branch 的圖。
  2. 可以使用 cherry-pick -r XXXX apply 特定 commit 所作的修改。
  3. 也可以再建一個 remote git repository,將 local git commit 到那邊去。
$ cat .git/config                                                               
[core]
        repositoryformatversion = 0 
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        hideDotFiles = dotGitOnly
; 此則為 remote git repository
[remote "origin"]
        url = ssh://git@10.18.128.89/home/git/git/B1_new.git
        fetch = +refs/heads/*:refs/remotes/origin/*
; 此則為 remote git branch
[branch "master"]
        remote = origin
        merge = refs/heads/master
[svn-remote "svn-source"]
    url = svn://XXX/OOO/branches/myproject
    fetch = :refs/remotes/svn-source
; 此則為 remote git branch
[branch "git-B1_new"]
        remote = origin
        merge = refs/heads/git-B1_new

沒有留言:

張貼留言