元のページ

ステージ1: Mercurial演習 (情報工学実験 3 : データマイニング班)

目次
  1. 想定環境
    • OS: Mac OS X 10.8.x (10.7.x以降であれば同じ方法で問題無いはず)
    • Python: 2.7.x
    • Mercurial: 2.2


  2. 環境変数の設定。

    ~/.zshrc 等のシェル用設定ファイルで下記を設定。EDITOR は vi 好きな人はそう設定してください。

    export HGENCODING=UTF-8
    EDITOR=emacs
    



  3. hg 設定ファイルの編集。

    commit する際のユーザ名を指定しておきましょう。~/.hgrc に下記を設定。

    [ui]
    username = Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
    
    これを設定しておくと、commit 時の username が見つからなかったとかいうwarning が出なくなります。他にも ignore など便利な機能もありますので、調べてみよう。



  4. リモートでリポジトリを作成。

    新しくプロジェクトを始める際には専用のリポジトリを作成してから作業を始めましょう。ここでは shark にログインし、リポジトリを作成します。

    リポジトリの場所は、~info3dm/HG/2013/ 以下にしてください。
     ・個人利用のものは ~info3dm/HG/2013/e1157xx/
     ・グループ利用のものは ~info3dm/HG/2013/groupname/
     ・全員共同利用のものは ~info3dm/HG/2013/share2/
    とします。
    
    例えば、e115700 というアカウントの人が個人利用のリポジトリを
    つくる場合には以下のようにします。
     macbook> ssh info3dm@shark
     shark% cd HG/2013
     shark% hg init e115700
    これで shark 側での作業は終了です。
    (他に shark 上で作業する必要が無ければ exit しましょう)
    


  5. ローカルにリポジトリを複製する。

    実際に作業するには、ローカル側で前述のリポジトリを複製し、複製したリポジトリ内で作業することになります。例えば上記で作成した「~/HG/2013/e115700/」のリポジトリを複製するためには以下のコマンドを実行しましょう。

    macbook> mkdir temp  #作業用ディレクトリを作成
    macbook> cd temp
    macbook> hg clone ssh://info3dm@shark//home/info3dm/HG/2013/e115700/
    

    引数が長ったらしいですが、これも一度zshで実行しておくと、「hg」や「hg clone」まで入力した状態で Ctrl+P で以前利用した引数を自動で補完してくれます。



  6. リポジトリ内で作業する。通常編。

    ファイル生成したら add して、必要な時に commit します。ただし、衝突の可能性があるため【commit 前に pull で確認】すべし。(後述:マージの例)

    • hg statuc, add (新規ファイルの追加)
      # ファイル名(以下ではA.txt)を新規作成したならその旨を通知。
      # 作成直後は mercurial が管理すべきかを判断できない状態。
      # hg status で確認すると「?」。管理対象ファイルが更新されていると「M(odified)」。
      macbook> hg status
      ? A.txt
      
      # 複数同時も可。ファイル名を省略すると、ignore対象になっていない
      # 全ての未通知ファイル(hg status で「?」になってるファイル全て)が
      # 登録対象になります。
      macbook> hg add A.txt
      
    • hg commit, push (ローカルリポジトリにコミット、リモートリ(オリジナル)ポジトリにコミット)
      # commit するだけではローカルのみへ反映。
      # 複製元リポジトリにもコミットするには push し忘れないように注意。
      macbook> hg commit
      macbook> hg push
      
    • hg log -v (コミットログの参照。-vで更新されたファイル名も出力)
      macbook> hg log -v
      チェンジセット:   0:8a3ead86bd87
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 17:08:45 2013 +0900
      ファイル:         A.txt
      説明:             1回目の追加
      


  7. hg update (必要に応じて古いバージョンに戻したり、複製元リポジトリの更新を加えたり)
    # B.txt, C.txt を追加してチェンジセットが0と1がある状態で確認。
    macbook> hg log -v
    チェンジセット:   1:2867a2b8b1ae
    タグ:             tip
    ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
    日付:             Mon Oct 14 17:12:11 2013 +0900
    ファイル:         B.txt C.txt
    説明:             追加更新
    
    
    チェンジセット:   0:8a3ead86bd87
    ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
    日付:             Mon Oct 14 17:08:45 2013 +0900
    ファイル:         A.txt
    説明:             1回目の追加
    
    # B.txt , C.txt を追加したばかりのチェンジセットは1。
    # A.txt を追加した古いチェンジセットは0。
    # このようにhg log -v で更新履歴を参照できます。
    # 以下は古いチェンジセット0を指定(=古いバージョン)し、更新(=復元)している例です。
    macbook> hg update 0
    ファイルの更新数 0、 マージ数 0、 削除数 2、 衝突未解消数 0
    macbook> ls
    A.txt
    
    # 引数省略すると最新バージョンに更新。
    macbook> hg update
    ファイルの更新数 2、 マージ数 0、 削除数 0、 衝突未解消数 0
    macbook> ls
    A.txtB.txtC.txt
    
    # 複製元の更新をローカルリポジトリに加えるには、
    # (1) hg pull でサーバ側の更新をロードし、
    # (2) hg update でその更新を反映させる。
    # (1)と(2)を同時にするには「hg pull --update」。衝突気にしないならこれで十分。
    


  8. チェンジセットとマージの関係。
    • チェンジセット0に戻し、A.txtを変更してみる。(hg heads/parents)
      macbook> hg update 0
      (A.txtの編集)
      macbook> hg status
      M A.txt
      macbook> hg commit
      新規ヘッドが増えました
      
      # 通常は、ヘッド(=子チェンジセットを持たないチェンジセット)は一つ。
      # 今回は、一度チェンジセット0に戻ってから再コミットしたため、
      # (1) 最初のチェンジセット0->1という更新(0がヘッド、1が子チェンジセット)。
      # (2) 今回のチェンジセット0->2という更新(0がヘッド、2が子チェンジセット)。
      # という形で、チェンジセット0を親として2方向の更新が並んでいる状態。
      # そのため、hg heads や hg log では複数の履歴が表示される。
      
      macbook> hg heads
      チェンジセット:   2:2adf51ddc4f8
      タグ:             tip
      親:               0:8a3ead86bd87
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 21:24:12 2013 +0900
      要約:             チェンジセット0から修正。
      
      チェンジセット:   1:2867a2b8b1ae
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 17:12:11 2013 +0900
      要約:             追加更新
      macbook> hg log
      チェンジセット:   2:2adf51ddc4f8
      タグ:             tip
      親:               0:8a3ead86bd87
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 21:24:12 2013 +0900
      要約:             チェンジセット0から修正。
      
      チェンジセット:   1:2867a2b8b1ae
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 17:12:11 2013 +0900
      要約:             追加更新
      
      チェンジセット:   0:8a3ead86bd87
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 17:08:45 2013 +0900
      要約:             1回目の追加
      
      # hg log の出力結果にも含まれているが、
      # hg parents では現在のチェンジセットの親を確認できる。
      
      macbook> hg parents
      チェンジセット:   2:2adf51ddc4f8
      タグ:             tip
      親:               0:8a3ead86bd87
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 21:24:12 2013 +0900
      要約:             チェンジセット0から修正。
      
    • チェンジセット間の差分を確認してみる。
      # hg diff にリビジョン番号を指定して実行。
      # 差分を見るのでどれを基準にするかで出力結果が異なることに注意。
      
      macbook> hg diff -r 2 -r 0
      diff -r 2adf51ddc4f8 -r 8a3ead86bd87 A.txt
      --- a/A.txtMon Oct 14 21:24:12 2013 +0900
      +++ b/A.txtMon Oct 14 17:08:45 2013 +0900
      @@ -1,1 +0,0 @@
      -additional modify
      
      macbook> hg diff -r 0 -r 2
      diff -r 8a3ead86bd87 -r 2adf51ddc4f8 A.txt
      --- a/A.txtMon Oct 14 17:08:45 2013 +0900
      +++ b/A.txtMon Oct 14 21:24:12 2013 +0900
      @@ -0,0 +1,1 @@
      +additional modify
      
    • マージに挑戦。
      # ここまででチェンジセット0を基準にした子チェンジセットは1と2の二つがある。
      # まだ子チェンジセット(=枝)毎の開発があるならそのまま進めてまわないが、
      # 一段落した所で統合する必要がある。
      # 以下ではチェンジセット1をベースに、チェンジセット2をマージしてみる。
      
      macbook> hg update 1
      ファイルの更新数 3、 マージ数 0、 削除数 0、 衝突未解消数 0
      macbook> hg merge 2
      ファイルの更新数 1、 マージ数 0、 削除数 0、 衝突未解消数 0
      (マージ結果の commit を忘れずに)
      macbook> hg resolve --list
      //(何も出力されない)
      
      # 今回は、チェンジセット1ではB.txtとC.txtの追加。
      # チェンジセット2ではA.txtの編集ということで、
      # 2つの枝は重なる(=衝突)部分が存在しなかったため、
      # 「衝突未解消数」は0になっている。
      # この数が1以上ある場合には、自前で修正する必要が出てくる。
      # 衝突が存在するなら、hg resolve --list でファイル名を確認できる。
      # 今回は衝突が存在しないため単にコミットするだけで解決したことになる。
      
      macbook> hg commit
      
    • マージ直後のチェンジセットは、親が2つになる。
      macbook> hg parents
      チェンジセット:   3:9aacfe5d6f27
      タグ:             tip
      親:               1:2867a2b8b1ae
      親:               2:2adf51ddc4f8
      ユーザ:           Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
      日付:             Mon Oct 14 21:51:33 2013 +0900
      要約:             子チェンジセット0と1を統合。
      

Level 1: 衝突を解決してみよう

チェンジセットとマージの関係では衝突が起きないケースでのマージを行った。これを参考に意図的に衝突が起きるような更新を行い、衝突を解消せよ。この際、各自「~/HG/2013/account/mergetest/」というリポジトリを作成し、少なくとも下記3点について Readme.txt として報告すること。(Readme.txtをリポジトリに作成し、そこで報告すること)