SlideShare a Scribd company logo
hgsubversionについて

 TokyoMercurial#3 発表資料
          2012/04/14
@cointoss1973 Takayuki KONDO
hgsubversionとは
• hgsubversionとは
  – MercurialのExtension
    • Mercurialには同梱されていません
  – Mercurialをsubversionクライアントとして使用




                                      2
こんな人におすすめ
• Mercurial中級者以上
 – マルチプルヘッド、rebase を理解していれば
   OK
• Subversionリポジトリをhg を使いたい
 – Mercurialに移行するためにはハードルが高い
 – Subversionのリポジトリのまま一人でも始めら
   れる
   • 少しずつhgを普及することも


                              3
Subversion リポジトリと連携するた
           めのいくつかの方法
方法                良い点                              悪い点
hgsubversionを使う   •   簡単、準備が速い                     •   でかいリポジトリのcloneが遅い
                  •   新しいリビジョンの取得可能                •   svn python bindings に依存
                  •   SVNに直接pushできる                •   歴史に奇妙な要素がある場合イン
                                                       ポートに失敗することがある
MQだけ使う            •   セットアップ簡単。迅速かつ安               •   リネームはSVNで直接行うこと
                      価                            •   SVNの歴史がないため、hg grep ,
                  •   SVNクライアントと、MQ拡張                  hg annotate, hg bisect が使えな
                      を使用するだけ                          いし、糞マージ
                                                   •   面倒かも
Convert拡張を使う      •   完全なSVNの歴史。hg grep hg         •   リネームはSVNで直接行うこと
                      annotate, hg bisect が使え、良い   •   変更のpushは面倒かも
                      マージが使える                      •   最近のMercurialが必要で、SVN
                                                       bindings のセットアップが難しい
                                                       かも。
                                                   •   ヒント:TortoiseHgには含まれて
                                                       る

                                                                               4
hgsubversion インストール方法
適当な場所に clone する
$ hg clone http://bitbucket.org/durin42/hgsubversion/ ~/hgsubversion




~/.hgrc に追加する
[extensions]
hgsubversion = ~/hgsubversion/hgsubversion


お疲れ様でした


                                                                       5
hgsubversionのインストール確認
$ hg version --svn
Mercurial - 分散構成管理ツール(バージョン 2.1.1)
(詳細は http://mercurial.selenic.com を参照のこと)

Copyright (C) 2005-2012 Matt Mackall 他
本製品はフリーソフトウェアです。
頒布条件に関しては同梱されるライセンス条項をお読みください。
市場適合性や特定用途への可否を含め、 本製品は無保証です。

hgsubversion: 8a226f0f99aa
Subversion: 1.6.13
bindings: SWIG

                                            6
hgsubversion テスト

tkondou@zion3:~/hgext/hgsubversion$ python tests/run.py
..............................................................................................................................
..............................................................................................................................
..............................................................................................................................
...................................................................................................................
----------------------------------------------------------------------
Ran 493 tests in 413.744s

OK
tkondou@zion3:~/hgext/hgsubversion$



                                                                                                                             7
リポジトリのclone方法
• SVNリポジトリをcloneしてみましょう
$ hg clone http://python-nose.googlecode.com/svn nose-hg




• なお、大きいリポジトリをcloneする場合
  は、hg init し [paths] を設定してから pull
  すると吉


                                                           8
TortoiseHg で歴史表示
• subversion の revision が表示できる
  – Converted From にチェック




                                 9
Converted Column




                   10
SVNに成果を反映




            11
hgsubversionの作業フロー
                                                              5
                           4              4
                                                              4

               hg commit   3   hg pull    3      5
                                                              3

           2               2              2    hg rebase --svn 2   hg push
hg clone

           1               1              1                   1


                                  rebaseの手順
                                  $ (hg update –r 3)
      自分がコミットしたRev                $ hg rebase –svn
                                  $ hg push
       SVNに登録されたRev
                                                                       12
よくあるケース:push できない
• 現象:SVNにpush時、エラーメッセージが出る


• 原因1
 – SVN側が更新されており、pullする必要がある状態で
   pullしていない
   • 対策: pull して rebase すればOK
• 原因2
 – SVNにコミット済みのチェンジセットを誤って
   strip(削除)してしまった
   • 対策: hg rebuildmeta し hg pull すればOK

                                          13
rebaseとは
• rebaseが必要
 – rebase とは指定したリビジョンの親リビジョ
   ンを差し替えること
     – マルチプルヘッドのマージした状態を解消する

• なぜ必要?
 – SVNの歴史を直線にする必要がある
   • マルチプルヘッドをマージした状態はpushできな
     い



                                14
削除したSVNコミット済みを復旧
• hg svn rebuildmetaを使って再度pullすれば
  OK。
 $ hg svn rebuildmeta
 $ hg pull
 $ hg update




                                    15
hgsubversion の制約・注意点




                       16
hgsubversion
                layoutと機能の関係

Subversionのレイアウ         svn:externals   途中Revからの
ト                                       clone
standard-layout         ○               ×
(trunk/branches/tags)                   未対応



single-layout           ×               ○
(trunk)                                 対応


                                               17
hgsubversion の制約
• × コミット時刻が変わる
 – コミットした時刻ではなく、push した時刻が
   コミットの時刻になる
    – push = svn commit であるため。


• × 日本語ファイル名使えない
 – 日本語ファイル名が含まれているとcloneでき
   ない。またhg側で日本語ファイル名を含めて
   pushするとSVN側が破壊される

                                 18
hgsubversion の制約
• × merge : 使えない
   • マルチプルヘッドやブランチをマージした状態を
     push できない
     – 対策:rebase を用い履歴を直線にする
• × tag : hg側でtag作成してpushしても反映
  されない
   • SVN側で作成すればOK
• × branch : hg側でbranch作成してpushして
  も反映されない
   • SVN側で作成すればOK

                                    19
svn-externals属性を扱う




                     20
svn-externals 属性も扱える
• .hgsvnexternals を作成
     • 定義は“半角スペース”から始まることに注意
 [lib]
  extlib http://svn.hoge.co.jp/svn/extlib


• 追加および更新
 $ hg add .hgsvnexternals

 $ hg svn updateexternals

                                            21
まとめ
• Mercurial初心者が、SVNからの移行で
  hgsubversionから導入することはおすすめ
  しません




                              22
ご清聴ありがとうございました
• hgsubversionは素晴らしいので、SVNを生
  で使うのはやめましょう
• 参考リンク
   • http://mercurial.selenic.com/wiki/HgSubversion
   • https://bitbucket.org/durin42/hgsubversion/overview




                                                           23

More Related Content

Hgsubversionについて

  • 1. hgsubversionについて TokyoMercurial#3 発表資料 2012/04/14 @cointoss1973 Takayuki KONDO
  • 2. hgsubversionとは • hgsubversionとは – MercurialのExtension • Mercurialには同梱されていません – Mercurialをsubversionクライアントとして使用 2
  • 3. こんな人におすすめ • Mercurial中級者以上 – マルチプルヘッド、rebase を理解していれば OK • Subversionリポジトリをhg を使いたい – Mercurialに移行するためにはハードルが高い – Subversionのリポジトリのまま一人でも始めら れる • 少しずつhgを普及することも 3
  • 4. Subversion リポジトリと連携するた めのいくつかの方法 方法 良い点 悪い点 hgsubversionを使う • 簡単、準備が速い • でかいリポジトリのcloneが遅い • 新しいリビジョンの取得可能 • svn python bindings に依存 • SVNに直接pushできる • 歴史に奇妙な要素がある場合イン ポートに失敗することがある MQだけ使う • セットアップ簡単。迅速かつ安 • リネームはSVNで直接行うこと 価 • SVNの歴史がないため、hg grep , • SVNクライアントと、MQ拡張 hg annotate, hg bisect が使えな を使用するだけ いし、糞マージ • 面倒かも Convert拡張を使う • 完全なSVNの歴史。hg grep hg • リネームはSVNで直接行うこと annotate, hg bisect が使え、良い • 変更のpushは面倒かも マージが使える • 最近のMercurialが必要で、SVN bindings のセットアップが難しい かも。 • ヒント:TortoiseHgには含まれて る 4
  • 5. hgsubversion インストール方法 適当な場所に clone する $ hg clone http://bitbucket.org/durin42/hgsubversion/ ~/hgsubversion ~/.hgrc に追加する [extensions] hgsubversion = ~/hgsubversion/hgsubversion お疲れ様でした 5
  • 6. hgsubversionのインストール確認 $ hg version --svn Mercurial - 分散構成管理ツール(バージョン 2.1.1) (詳細は http://mercurial.selenic.com を参照のこと) Copyright (C) 2005-2012 Matt Mackall 他 本製品はフリーソフトウェアです。 頒布条件に関しては同梱されるライセンス条項をお読みください。 市場適合性や特定用途への可否を含め、 本製品は無保証です。 hgsubversion: 8a226f0f99aa Subversion: 1.6.13 bindings: SWIG 6
  • 7. hgsubversion テスト tkondou@zion3:~/hgext/hgsubversion$ python tests/run.py .............................................................................................................................. .............................................................................................................................. .............................................................................................................................. ................................................................................................................... ---------------------------------------------------------------------- Ran 493 tests in 413.744s OK tkondou@zion3:~/hgext/hgsubversion$ 7
  • 8. リポジトリのclone方法 • SVNリポジトリをcloneしてみましょう $ hg clone http://python-nose.googlecode.com/svn nose-hg • なお、大きいリポジトリをcloneする場合 は、hg init し [paths] を設定してから pull すると吉 8
  • 9. TortoiseHg で歴史表示 • subversion の revision が表示できる – Converted From にチェック 9
  • 12. hgsubversionの作業フロー 5 4 4 4 hg commit 3 hg pull 3 5 3 2 2 2 hg rebase --svn 2 hg push hg clone 1 1 1 1 rebaseの手順 $ (hg update –r 3) 自分がコミットしたRev $ hg rebase –svn $ hg push SVNに登録されたRev 12
  • 13. よくあるケース:push できない • 現象:SVNにpush時、エラーメッセージが出る • 原因1 – SVN側が更新されており、pullする必要がある状態で pullしていない • 対策: pull して rebase すればOK • 原因2 – SVNにコミット済みのチェンジセットを誤って strip(削除)してしまった • 対策: hg rebuildmeta し hg pull すればOK 13
  • 14. rebaseとは • rebaseが必要 – rebase とは指定したリビジョンの親リビジョ ンを差し替えること – マルチプルヘッドのマージした状態を解消する • なぜ必要? – SVNの歴史を直線にする必要がある • マルチプルヘッドをマージした状態はpushできな い 14
  • 15. 削除したSVNコミット済みを復旧 • hg svn rebuildmetaを使って再度pullすれば OK。 $ hg svn rebuildmeta $ hg pull $ hg update 15
  • 17. hgsubversion layoutと機能の関係 Subversionのレイアウ svn:externals 途中Revからの ト clone standard-layout ○ × (trunk/branches/tags) 未対応 single-layout × ○ (trunk) 対応 17
  • 18. hgsubversion の制約 • × コミット時刻が変わる – コミットした時刻ではなく、push した時刻が コミットの時刻になる – push = svn commit であるため。 • × 日本語ファイル名使えない – 日本語ファイル名が含まれているとcloneでき ない。またhg側で日本語ファイル名を含めて pushするとSVN側が破壊される 18
  • 19. hgsubversion の制約 • × merge : 使えない • マルチプルヘッドやブランチをマージした状態を push できない – 対策:rebase を用い履歴を直線にする • × tag : hg側でtag作成してpushしても反映 されない • SVN側で作成すればOK • × branch : hg側でbranch作成してpushして も反映されない • SVN側で作成すればOK 19
  • 21. svn-externals 属性も扱える • .hgsvnexternals を作成 • 定義は“半角スペース”から始まることに注意 [lib] extlib http://svn.hoge.co.jp/svn/extlib • 追加および更新 $ hg add .hgsvnexternals $ hg svn updateexternals 21
  • 22. まとめ • Mercurial初心者が、SVNからの移行で hgsubversionから導入することはおすすめ しません 22
  • 23. ご清聴ありがとうございました • hgsubversionは素晴らしいので、SVNを生 で使うのはやめましょう • 参考リンク • http://mercurial.selenic.com/wiki/HgSubversion • https://bitbucket.org/durin42/hgsubversion/overview 23