git-svn

gitとsvnのインターオペラビリティーを確立するツール。パッケージ的にはgit-svn

svkで作ったレポジトリと平行してつついてみます。

svnのレポジトリをひっぱる

git-svnでやる場合はこんな感じ

% git svn clone http://svn.catatsumuri.org/test
Initialized empty Git repository in /home/roux/tmp/git-svn/test/.git/
W: +empty_dir: trunk
r1 = 4d98c0c9f454dc22a6a8905196af3c4243160759 (git-svn)
        A       trunk/test.txt
r2 = 1f61bd68a295443bbb41d8b3ee0f1dafba76e53a (git-svn)
        A       trunk/test2.txt
r3 = eb9e4d49651fe25608d2ca1c25b0e721564b09fd (git-svn)
        D       trunk/test2.txt
r4 = 15f647a5616b31a552988c63d2bfc455a91ffb37 (git-svn)
        A       trunk/test2.txt
r5 = 89f38a7e1a7181e2f2c0ee31270a45b740145723 (git-svn)
        M       trunk/test2.txt
r6 = 950af32364be77ed4d3149076293a72d1b378c20 (git-svn)
        M       trunk/test2.txt
r7 = 4f3372f3ebd6d94e04d4731c337968bad0b6029d (git-svn)
        M       trunk/test2.txt
r8 = eba77c4c05837e2045be05a5e908400b2e1bc965 (git-svn)
        M       trunk/test2.txt
r9 = 756a2bef0a02de9b7f59c85f902b63a8070f2123 (git-svn)
Checked out HEAD:
  http://svn.catatsumuri.org/test r9

作業

ここでチェックアウトされたtestディレクトリをfindすると.gitの中にいろいろつまってるのがわかる、ともあれ修正をかけてみる。

% cd test/trunk

% cat test.txt 
mogemoge

% echo mogemoge >> test.txt

% git diff 

% git status

% git add test.txt

% git commit -m 'add line'                          
Created commit 8761999: add line
 1 files changed, 1 insertions(+), 0 deletions(-)

これだけでは例によってsubversion側に何も影響を与えないのであるが、もう一度コミットして、svn側でどう扱われるか見てみる。

% echo mogemoge >> test.txt 

% git commit -a -m 'add more line'                
Created commit 0c3e291: add more line
 1 files changed, 1 insertions(+), 0 deletions(-)

svn側に反映

さて、こんな感じでsvn側に反映させてみるわけだけども、これにはdcommitを利用する。

% git svn dcommit                                       
Committing to http://svn.catatsumuri.org/test ...
        M       trunk/test.txt
Committed r10
        M       trunk/test.txt
r10 = 1778eb4f832c41a0b81af4928cf1efe73c46925a (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn
trunk/test.txt: needs update
        M       trunk/test.txt
Committed r11
        M       trunk/test.txt
r11 = edef42242243e441f7d9854e2ece27e3e7131e23 (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn

svn側から覗いてみる

svn側のレポジトリをupして、そのlogをみた感じがこんな感じ

% svn log -v

------------------------------------------------------------------------
r11 | user | 2008-11-10 23:29:09 +0900 (月, 10 11月 2008) | 1 line
変更のあったパス:
   M /trunk/test.txt

add more line
------------------------------------------------------------------------
r10 | user | 2008-11-10 23:29:09 +0900 (月, 10 11月 2008) | 1 line
変更のあったパス:
   M /trunk/test.txt

add line
------------------------------------------------------------------------

とまぁこんな具合でr10,11にそれぞれ反映されている。すなわち「コミットした分だけrevisionが上がる」というわけでsvk pushと似ている感じ。ただし余計な属性は付かない。git側ではこの辺あんま関知しないよ、という事なのかもしれない

% svn diff -r 9:11

Index: /path/to/test/trunk/test.txt
===================================================================
--- /path/to/test/trunk/test.txt      (リビジョン 9)
+++ /path/to/test/trunk/test.txt      (リビジョン 11)
@@ -1 +1,3 @@
 mogemoge
+mogemoge
+mogemoge

一気に送出するには?

ここでgitの強力なブランチ管理機能を利用。作業ブランチをworkとし、そこで作業してみる。

% git branch work 

% git branch 
* master
  work

「*」が付いてるのが現在利用中のブランチ。今はmasterになっているのでworkに切り換える。

% git checkout work       
Switched to branch "work"

% git branch  
  master
* work

とりあえず最新の状態にアップデートしてみる。ここでsvn側からtest2.txtに変更がかかったとする。ここでgit svn rebaseとする

% git svn rebase                                         
        M       trunk/test2.txt
r12 = 6f05f5f80e1f614ee8e8134516896b3a522ecaa9 (git-svn)
First, rewinding head to replay your work on top of it...
Fast-forwarded work to refs/remotes/git-svn.

test2に変更があったので、それが変更されてコピーの更新が完了。

ここでtest.txtに2回ほど例によって変更をかける。

% cat test.txt  
mogemoge
mogemoge
mogemoge

% echo --------- >> test.txt

% git commit -a -m 'add line'                      
Created commit a3be01f: add line
 1 files changed, 1 insertions(+), 0 deletions(-)

% echo mogemoge >> test.txt 

% git commit -a -m 'add more strings'              
Created commit adfaa7a: add more strings
 1 files changed, 1 insertions(+), 0 deletions(-)

% cat test.txt 
mogemoge
mogemoge
mogemoge
---------
mogemoge

さて、これで準備OK。まずmasterに戻る

% git checkout master      
Switched to branch "master"

% git branch
* master
  work

ここでmasterにworkでやった事を「マージ」してしまう。

% git merge --squash work                         
Updating edef422..adfaa7a
Fast forward
Squash commit -- not updating HEAD
 trunk/test.txt  |    2 ++
 trunk/test2.txt |    5 +----
 2 files changed, 3 insertions(+), 4 deletions(-)

これをローカルにコミット

% git commit -m 'merged commit'                   
Created commit 47a009e: merged commit
 2 files changed, 3 insertions(+), 4 deletions(-)

さらにdcommit

% git svn dcommit
Committing to http://svn.catatsumuri.org/test ...
        M       trunk/test.txt
コミット中にマージの競合がありました: ファイルまたはディレクトリ 'trunk/test2.txt' はリポジトリ側と比べて古くなっています。update を実行してみてください: The version resource does not correspond to the resource within the transaction.  Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit). at /usr/bin/git-svn line 461

これはmasterをrebaseしてないのが敗因。

% git svn rebase                   
Current branch HEAD is up to date.

% git merge --squash work                           
Updating 6f05f5f..adfaa7a
Fast forward
Squash commit -- not updating HEAD
 trunk/test.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

% git commit -m 'merged commit'                   
Created commit 5095b4f: merged commit
 1 files changed, 2 insertions(+), 0 deletions(-)

ここでdcommit

% git svn dcommit                                         
Committing to http://svn.catatsumuri.org/test ...
        M       trunk/test.txt
Committed r13
        M       trunk/test.txt
r13 = 4b42e51f60e51e24b4021ad06657ba50927b51ae (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn

svn側を更新してみる。

------------------------------------------------------------------------
r13 | user | 2008-11-10 23:58:56 +0900 (月, 10 11月 2008) | 1 line

merged commit
------------------------------------------------------------------------

よさそうですね。diffも

% svn diff -r 12:13

@ -1,3 +1,5 @@
 mogemoge
 mogemoge
 mogemoge
+---------
+mogemoge

必要なくなったブランチは消してしまってもOK。

% git branch -D work 
Deleted branch work.

複数人でsvn reposをゴチャゴチャ弄ってたりする場合はrebaseしてやるのを忘れると面倒かもしれないけど、とりあえずこんなのでも問題なく使えました。

git-svn.txt · 最終更新: 2012/04/07 10:32 (外部編集)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0