Description
接之前預想的 local git + remote SVN 運作方式,我試了幾天後沒什麼問題,整理一下以實例的方式分享給大家參考,如果有任何更好的方法再請不吝賜教。: )
Environment description:
SVN respository:
SVN://XXX/OOO/branches/myproject
Expected result:
- Have a local git repository for track.
- Easy to modify for debugging and fixing issues.
- 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
- 方便從SVN 上取出任一版本出來修改驗証。
- 方便將修改驗証後的 git branch merge back 到 SVN 中。
Other
- 可以在 svn command line 使用 gitk –all 看到所有 branch 的圖。
- 可以使用 cherry-pick -r XXXX apply 特定 commit 所作的修改。
- 也可以再建一個 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
沒有留言:
張貼留言