1. Top » 
  2. mercurial

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Genre:

【mercurial】【バージョン管理】mercurialの話(四度目)

引き続きmercurialの基本的な使い方の話です(個人用)
今までの記事はこちら。

一度目の話 【mercurial】【バージョン管理】mercurialの話(最初)
二度目の話 【mercurial】【バージョン管理】mercurialの話(二度目)
三度目の話 【mercurial】【バージョン管理】mercurialの話(三度目)



さて、前回までで出来ていることをまとめます。
・ディレクトリの初期化、管理対象の追加、状態の確認(init/add/status)
・リビジョンの作成と確認(commit/log)
・由来の確認(annotate)
・リビジョンの変更(update)

今回は先に進む前に、少し便利な使い方を見ます。

まず初めに、過去のリビジョンを配布したいときです。いちいち
1.古いリビジョンにupdate
2.cpしてディレクトリを保存
3.再び元のリビジョンに戻す
という手順を踏むのは大変です。

これを解決してくれるコマンドは hg archive を利用します。
今、hg parentsで現在のリビジョンを、そして保存したいリビジョンをhg logで
それぞれ確認します。

ここでは現在のリビジョンが2、出力したいリビジョンが1とします。
hg archiveを利用して、リビジョン1を./work.(リビジョンの文字列)に保存します

taki@false:~/program/test$ hg archive -r1 ./work.%h

このようにします。
カレントディレクトリにwork.%hというディレクトリを作ってリビジョン1を保存。
rはrevisionの頭文字で%hにはrevisionの番号1に相当する文字列がつきます。
実際に作成されているのか確認します。

taki@false:~/program/test$ ls
test.c work.6b6bff58ecb8
taki@false:~/program/test$ cat work.6b6bff58ecb8/test.c
#include
int main(int argc, char** argv){
printf("test message\n");
printf("test message no 2\n");
return 0;
}

このように古いソースが復元されました。
こうすることでリビジョン単位でファイルの受け渡しが可能になります。
せっかくなのでディレクトリをtgz形式で保存してみます。

taki@false:~/program/test$ hg archive -t tgz -r2 ./work.%h.tgz
taki@false:~/program/test$ ls
test.c work.6b6bff58ecb8 work.f9a2ea1a3ee0.tgz

現在のリビジョンをtgzで保存してみました。
中にはきっと入っていることでしょう。

hg archiveは対象ディレクトリ全てを扱ってくれますが
hg catを使うと特定のファイルのみを扱ってくれます。

taki@false:~/program/test$ hg cat -r1 test.c
#include <stdio.h>
int main(int argc, char** argv){
printf("test message\n");
printf("test message no 2\n");
return 0;
}

リビジョン1のソースを取り出す。

taki@false:~/program/test$ hg cat -r0 test.c
#include <stdio.h>
int main(int argc, char** argv){
printf("test message\n");
return 0;
}

リビジョン0のソースを取り出す。
このようにすると、各リビジョンの一部のファイルだけを
うまく利用することが出来ます。

次回はタグの話をするか、hg自体の話をするか。
今のところ検討中です。
スポンサーサイト

【mercurial】【バージョン管理】mercurialの話(三度目)

一度目の話 【mercurial】【バージョン管理】mercurialの話(最初)
二度目の話 【mercurial】【バージョン管理】mercurialの話(二度目)



全開までで使ったコマンドはこのようなものです

・hg init 初期化
・hg add 管理対象への追加
・hg status 対象のファイルの状態を確認
・hg commit リビジョンを作る
・hg log リビジョンの情報を見る(オプション-r/-p/-vなど)


今はファイルなどをリビジョンとして追加していくことしかできません。
出来ればファイルを復元したり出力したりしたいところです。

まず、対象ファイル(今はtest.cでした)がどのリビジョンで変更されたのか。
いつcommitしたときに変更を加えられたのかを見ることが出来ます。
そのためのコマンドが hg annotate です。
引数としてファイル名を指定してあげます。

taki@false:~/program/test$ hg annotate test.c
0: #include <stdio.h>
0: int main(int argc, char** argv){
0: printf("test message\n");
1: printf("test message no 2\n");
0: return 0;
0: }


このようにその行の先頭に由来のリビジョンが表示されます。
再びtest.cを変更してcommitして、もう一度annotateをしてみると
また新しく由来のリビジョンが増えるはずです。

さて、次はリビジョンを元にして対象のファイルを遡ります。
つまりリビジョン1にいたとして、リビジョン0に戻るわけです。
リビジョン0をcommitした後に何かやらかしてしまったわけですね。
こういうときは hg update を使います。

まずはじめに hg parents を利用して
現在のリビジョンがいつ登録されたもので、番号は何かを確認します。

taki@false:~/program/test$ hg parents
changeset: 1:6b6bff58ecb8
tag: tip
user: taki@false
date: Sat Oct 24 09:04:48 2009 +0900
summary: Add printf and comment in English.

現在のリビジョンは1なのが分かる。

さて、リビジョン1からリビジョン0へ遡ります。

taki@false:~/program/test$ hg update 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

このように0へupdataするということです、メッセージがでていますね。
さて、annotateを利用して実際に確認します。

taki@false:~/program/test$ hg annotate test.c
0: #include <stdio.h>
0: int main(int argc, char** argv){
0: printf("test message\n");
0: return 0;
0: }

このように管理対象のtest.cが全てリビジョン0由来のものに変わりました。
ところで、リビジョン情報を調べてみます。

taki@false:~/program/test$ hg log
changeset: 1:6b6bff58ecb8
tag: tip
user: taki@false
date: Sat Oct 24 09:04:48 2009 +0900
summary: Add printf and comment in English.

changeset: 0:ec4b7d568ed4
user: taki@false
date: Sat Oct 24 09:02:37 2009 +0900
summary: ブログの記事のためのレポジトリに

taki@false:~/program/test$ hg parents
changeset: 0:ec4b7d568ed4
user: taki@false
date: Sat Oct 24 09:02:37 2009 +0900
summary: ブログの記事のためのレポジトリに

なるほど。
現在のリビジョンが0へ移っただけで、リビジョン1の情報はちゃんと残っています。
さて、再びupdateでリビジョン1へ戻ります。

taki@false:~/program/test$ hg update 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
taki@false:~/program/test$ hg annotate test.c
0: #include <stdio.h>
0: int main(int argc, char** argv){
0: printf("test message\n");
1: printf("test message no 2\n");
0: return 0;
0: }

このように戻りました。
これで今回はだいぶmercurialを使えるようになりました。
具体的には

・ファイルのどの部分がどのリビジョン由来かどうかを調べる
・ディレクトリ毎、別のリビジョンへと復活させる、もういちど戻す


このような感じです。
それではまた次回、書くもしれません。

【mercurial】【バージョン管理】mercurialの話(二度目)

一度目の話 【mercurial】【バージョン管理】mercurialの話(最初)



さて、まだしばらく書いていきます。
何かに書いておかないと自分が忘れてしまうんで・・・

【前回のおさらい】
1.mercurialはヴァージョンを管理するためのソフトだ
2.管理するあるヴァージョンのことはリビジョンと呼ぼう(revision)
3.あるディレクトリの初期化は hg init だ
4.そこのファイルを管理対称に追加するには hg add だ
5.管理しているファイルたちの状態は hg status で見られる

ここら辺まで書いてますね、自分で確認しました。
それでは今の状況をもう少し確認します。

/┬ test 対象
 ├ .hg  設定ファイル
 └ test.c 適当なコード

test.cはC言語の適当なソースでした。

#include <stdio.h>
int main(int argc, char** argv){
printf("test message\n");
return 0;
}

それでははじめていきます。

まず、新しいリビジョンを作ります。
リビジョンを作ると、その時点でのバージョンを保存して置いてくれます。
何か大きな変更をする前や、一日の終わりなどに使うのかな?
リビジョンを作っておくと番号がついて、それを操作できるようになります。
操作によって、あるリビジョンからファイルを復元したり、リビジョンごと保存したり
いろいろと便利です。

リビジョンを作るコマンドは hg commit です。
初期実行時、どのエディタを使って説明のファイルを書くのかを聞かれます。

taki@false:~/program/test$ hg commit
No username found, using 'taki@false' instead

Select an editor. To change later, run 'select-editor'.
1. /usr/bin/vim.tiny
2. /bin/ed
3. /bin/nano <---- easiest
4. /usr/bin/emacs-snapshot

Choose 1-4 [3]: 4

ちなみに私は4のemacs-snapshotですが、1とかでもいいかな。
Emacsを使っている最中にもう一つのEmacsが開くと少し邪魔です。

次のようにかかれているので、設定を書きます。

HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: --
HG: user: taki@false
HG: branch 'default'
HG: added test.c
ブログの記事のためのレポジトリに
C言語で書いた適当なソースを追加した

HGで始まらない行がコメント(commitのメッセージ)になります。
さて、commitすると設定フォルダの中に設定がかかれます。
これを参照するには、コマンド hg log を使います。


taki@false:~/program/test$ hg log
changeset: 0:ec4b7d568ed4
tag: tip
user: taki@false
date: Sat Oct 24 09:02:37 2009 +0900
summary: ブログの記事のためのレポジトリに

日本語が化けた。
得に設定してないからダメ。

このように、番号(changeset)やユーザ、日付、要約。
さらにはcommit時のメッセージを見ることができます
*これ、いつのlogだ・・・?


ちなみにcommitすると、今までhg statusでAになっていた
つまり「追加された」という状態になっていたものが表示されなくなります。
これはcommitされたためです。

logは何もオプションを指定しないと全て出力されます。
changesetの番号が分かっている場合、それを指定するといいでしょう。
指定する場合のコマンドオプションは-r(revisionの頭文字)です。

taki@false:~/program/test$ hg log -r 1
changeset: 1:6b6bff58ecb8
tag: tip
user: taki@false
date: Sat Oct 24 09:04:48 2009 +0900
summary: Add printf and comment in English.
このように、-r 1とすることでリビジョン番号1のログだけを取り出せる


このようにリビジョンを追加して、コメントを書いておくと
今の状態がどこまで進んだ状態なのか分かるようになります。
普段はsummaryだけの表示ですが、-vオプションを使うことで全てのコメントが表示されます。

また、リビジョンで結局どこが変更されたのか知りたい場合があるかもしれません。
その時は、コマンドオプションとして-pを使います。

taki@false:~/program/test$ hg log -r1 -p
changeset: 1:6b6bff58ecb8
tag: tip
user: taki@false
date: Sat Oct 24 09:04:48 2009 +0900
summary: Add printf and comment in English.

diff -r ec4b7d568ed4 -r 6b6bff58ecb8 test.c
--- a/test.c Sat Oct 24 09:02:37 2009 +0900
+++ b/test.c Sat Oct 24 09:04:48 2009 +0900
@@ -1,5 +1,6 @@
#include <stdio.h>
int main(int argc, char** argv){
printf("test message\n");
+ printf("test message no 2\n");
return 0;
}

どこが変更されたのか。
a->bと変更されている、おそらく追加+ということ。
追加されている行は+で表示されている。


ほほほ。
少しずつ便利になってきました。

それでは二回目のまとめ!

1.リビジョンを登録する時は hg commit
2.リビジョンを表示する時は hg log
3.logに-rと番号で、一つのリビジョンに絞れる
4.logに-vを使うと全てのコメントが見れる
5.logに-pを使うとどこが変わったのか見れる

まだまだ続きます。
ただ登録しただけではつまらないので、そろそろ回復とかも書きたいですね。

【mercurial】【バージョン管理】mercurialの話(最初)

mercurialは分散型のバージョン管理システム。
毎回プログラムを作るときに、例えば実験などで

%> cp 091022 091024

こんな感じをしてディレクトリを分けているのだけれども、とても面倒。
またどのディレクトリに何が入っているのか分かり辛くなって大変。
せっかくなのでバージョン管理を導入したい。
以上、mercurialへの動機のくだり。
ubuntuならば簡単に

taki@false%> sudo apt-get install mercurial

でインストール出来たはず。(少し前なので覚えていないです)
とりあえずコマンドhgが使えれば大丈夫でしょう。
さて、とりあえず適当な場所に場所を作って練習してみよう。

$taki@false:~/program/>mkdir test
$taki@false:~/program/>cd test
$taki@false:~/program/test>hg init
$taki@false:~/program/test>ls -aL
./ ../ .hg/

このようにディレクトリを作って初期化します。

初期化
$taki@false:~/program/test>hg init
hg initを実行したディレクトリを管理対象にします。
管理対象になると、設定の隠しディレクトリ .hg が作られます。


ところでhgは水銀のことですが。これはmercurialとかけているのかな?
さて、とりあえず適当なC言語のソースを書いてみます。

#include <stdio.h>
int main(int argc, char** argv){
printf("test message\n");
return 0;
}

このようにC言語のソース、まだ何も書いていない状態といった感じ。
これを管理対象にします。

管理対象というのはさっきから使っていますが
要するに復元したり、バージョンを見たり、いろいろ出来る対象と認識しています。
詳しく知っているわけではないのであれですが。
とりあえずディレクトリにうつって

$taki@false:~/program/test$hg status

このようにうつと、現在の対象ディレクトリの中身のファイルが
現在どのような状態になっているのか分かります。

taki@false:~/program/test$ hg status
? test.c

こうなっています。
今、ディレクトリ内部にあるtest.cは?という状態。
?は管理対象になっていないことを表しているらしい。
これを管理対象にするにはaddコマンドです。

taki@false:~/program/test$ hg add test.c
taki@false:~/program/test$ hg status
A test.c

このように状態がAになります。
管理対象に追加されました。

*管理対象はおそらく、普通の情報では「登録対象」かな。
*こういった管理されているまとまりをレポジトリと言うらしい、今回はtestレポジトリ
*ついでに言うとtestディレクトリがレポジトリルートです。
*発音的にはリポジトリかな?どっちでもいいでしょう、きっと。

Page Top

訪問者

お引っこし。 http://parabola.sblog.jp/

プロフィール

parabola0

Author:parabola0
Twitter用ですが…。
プロフィール

最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
リンク

このブログをリンクに追加する

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。