ステージ1: Mercurial演習 (情報工学実験 3 : データマイニング班)
目次- 環境変数の設定
- hg 設定ファイルの編集 (環境構築と同じ内容)
- リモートでリポジトリを作成
- ローカルにリポジトリを複製する
- リポジトリ内で作業する。通常編
- hg update (必要に応じて古いバージョンに戻したり、複製元リポジトリの更新を加えたり)
- チェンジセットとマージの関係
- (宿題) Level 1: 衝突を解決してみよう
- 想定環境
- OS: Mac OS X 10.8.x (10.7.x以降であれば同じ方法で問題無いはず)
- Python: 2.7.x
- Mercurial: 2.2
- 環境変数の設定。
~/.zshrc 等のシェル用設定ファイルで下記を設定。EDITOR は vi 好きな人はそう設定してください。
export HGENCODING=UTF-8 EDITOR=emacs
- hg 設定ファイルの編集。
commit する際のユーザ名を指定しておきましょう。~/.hgrc に下記を設定。
[ui] username = Naruaki TOMA <tnal@ie.u-ryukyu.ac.jp>
これを設定しておくと、commit 時の username が見つからなかったとかいうwarning が出なくなります。他にも ignore など便利な機能もありますので、調べてみよう。
- リモートでリポジトリを作成。
新しくプロジェクトを始める際には専用のリポジトリを作成してから作業を始めましょう。ここでは 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 しましょう)
- ローカルにリポジトリを複製する。
実際に作業するには、ローカル側で前述のリポジトリを複製し、複製したリポジトリ内で作業することになります。例えば上記で作成した「~/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 で以前利用した引数を自動で補完してくれます。
- リポジトリ内で作業する。通常編。
ファイル生成したら 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回目の追加
- hg statuc, add (新規ファイルの追加)
- 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」。衝突気にしないならこれで十分。
- チェンジセットとマージの関係。
- チェンジセット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を統合。
- チェンジセット0に戻し、A.txtを変更してみる。(hg heads/parents)
Level 1: 衝突を解決してみよう
チェンジセットとマージの関係では衝突が起きないケースでのマージを行った。これを参考に意図的に衝突が起きるような更新を行い、衝突を解消せよ。この際、各自「~/HG/2013/account/mergetest/」というリポジトリを作成し、少なくとも下記3点について Readme.txt として報告すること。(Readme.txtをリポジトリに作成し、そこで報告すること)- どの手順で衝突を起こしたのか。
- 具体的に衝突が起きているのはどこか。
- 衝突をどのように解消したのか。
- 注意: Mercurial 1.x と 2.x とでオプションや動作が異なる部分があるため、調べる際にはバージョンに注意すること。