忘れたときに備えた記録

トップ «前の日記(2007-05-21(Monday)) 最新 次の日記(2007-06-02(Saturday))» 編集
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|
2020|03|

2007-05-23(Wednesday)

分散バージョン管理

svkを使ってファイルを管理していたら、あるファイルで、元のSubversionのリポジトリでは実行フラグがついているのにsvkでチェックアウトしたファイルからは実行フラグが外れているという現象に遭遇した。

たまたま何日か前にMercurial で手軽な共有レポジトリをつくろう - www.textfile.orgMercurialというものを見かけていたので、少し調べてみた。

情報をある程度集めることができたのは

の2つだ。

Tags: SCM

Mercurial。

略称は'hg'

参考にしたページは

など。

コンパイルが簡単だという話で、実際に試してみたら本当に簡単にコンパイルできた。svkとはえらい違いだ(svkのコンパイルが大変すぎるのか)。

1つのプロジェクトに対して1つのリポジトリを作る。Subversionでいう作業コピーとリポジトリがhgでは同一に扱う。また、Subversionのようにサブディレクトリだけをチェックアウトとかcloneしたりはできない。

ブランチを作るときにはリポジトリ自体の複製を作る。このとき、リポジトリの作業用ファイルは独立したものになるけど、履歴情報などのファイルはハードリンクを使って複製元のものとある程度共有することでディスクの消費量を押さえている。これは次のようにして確認できた。

まず、適当なリポジトリのクローンを作る。

~/tmp$ hg clone http://selenic.com/repo/hg-stable
destination directory: hg-stable
requesting all changes
adding changesets
adding manifests
adding file changes
added 4073 changesets with 7791 changes to 581 files
506 files updated, 0 files merged, 0 files removed, 0 files unresolved
~/tmp$ du -sh *
9.5M    hg-stable

全部で9.5M。これの、ローカルのコピー(クローン)を作る。

~/tmp$ hg clone hg-stable my-hg
506 files updated, 0 files merged, 0 files removed, 0 files unresolved
hiraku@unidon:~/tmp$ du -sh *
9.5M    hg-stable
3.3M    my-hg

クローン先のファイル量はクローン元のものより少ない。

hiraku@unidon:~/tmp$ du -shl *
9.5M    hg-stable
9.5M    my-hg

duにlオプションをつけると、ハードリンクも別々に計算する。今度は同じ量で表示されている。

hiraku@unidon:~/tmp$ rm -rf hg-stable/
hiraku@unidon:~/tmp$ du -sh *
9.5M    my-hg

クローン元を消すと、当然クローン先だけが残って、ファイル量は9.5Mに。

一方、リポジトリの中でファイルのコピーや移動を行うと、その分だけディスクの消費量が増えるようだ。

だからたとえば、大量のファイルが入っているサブディレクトリを途中で名前変更したりすると、そのディレクトリに入っていたファイルの量だけリポジトリが消費するディスクの量が増大してしまう。 Subversionでは単に「コピー/移動を行った」という情報だけの保存になるのでこの点はちょっと残念。 ただし、コピー元、移動元の情報はきちんと残っているようだ。

Webでリポジトリを公開するためのCGIが付属していて、Mercurialのリポジトリのようなページを手元で簡単に公開することができる。特に、gzで固めたものやRSSによる更新情報を自動的に作ってくれるのは素敵。

svkの

svk push -l

に相当する機能がないようで、いろいろ調べた結果、ここに乗っているやり方を使えば、手動ではあるけど、複数のコミットを1回のリビジョンにまとめる事ができるようだ。

Tags: SCM

git

Linus B. TorvaldsがLinuxのカーネルソースを管理するために作ったSCM。

参考にしたのは、

など。

なんと、ファイルの移動とかはあるけど、コピーがない。まぁ、確かにあまり使わないけど。

つまり、

git mv hoge.c fuga.c

は出来ても、

git cp hoge.c fuga.c

は出来ない。

ファイル移動の際は、Subversionと同様に「移動した」という情報だけを保存するようだ。この点はhgに勝ってる。

Webでリポジトリを公開する用のCGIもついている。Debianでは、gitwebという別パッケージになっていた。

このgitwebは、Debianでは

  • /etc/gitweb.conf : 設定ファイル
  • /usr/lib/cgi-bin/gitweb.cgi : CGI本体

に分かれている。gitweb.cgiを自分のホームディレクトリのpublic_htmlの下にでも置けば、自分用の公開ページが作れる。実際の手順としては、

リポジトリをまとめるためのディレクトリを作る

$ mkdir ~/gits

各リポジトリの.gitファイルへのリンクを、この中に適当な名前で張る。

$ ln -s ~/work/hoge/.git ~/gits/hoge.git

次にgitweb.cgiの

our $GITWEB_CONFIG = $ENV{'GITWEB_CONFIG'} || "/etc/gitweb.conf";

our $GITWEB_CONFIG = "/home/myname/gitweb.conf";

とか直して、自分専用のgitweb.confの置き場所を指定する。

最後に gitweb.conf の

$projectroot = "/var/cache/git";

$projectroot = "/home/myname/gits";

とする。これでリポジトリを公開できる。

svk push -l

に相当する機能は、

git pull --squash

で出来る。svkの方はlump(塊)でgitはsquash(押しつぶす)。この単語を知らなくて、最初はマニュアルに載っているのを見逃してしまった。

Tags: SCM

pushできるgitのリポジトリの公開

さっき試してみたら、gitwebではブラウザでの閲覧だけが出来て、gitでのcloneが出来なかった。

$ git-clone http://git/repos/test/
Cannot get remote repository information.
Perhaps git-update-server-info needs to be run there?

いろいろ試してみたら、リポジトリの.gitディレクトリにhttpでアクセスできればcogitoを使ってcloneは出来るとわかった。

cg-clone http://git/repos/test/.git

ただし、これだけではcloneしたものに変更を加えてもpushすることは出来ない。

Unable to lock remote branch refs/heads/master

というエラーが出る。

これを解決するには、まずApacheの設定で、gitのリポジトリを入れてあるディレクトリの設定に

DAV on

を追加する。詳しくは

で解説されている。

ただ、Debian4.0ではこれだけではだめで、以下の手順が必要になる。

$ sudo a2enmod dav_fs
$ sudo chown -R www-data.www-data /var/lock/apache2/

2つ目のコマンドはWebDAVに使うファイルの置き場所の所有権を変更している。 このディレクトリは、Apacheが動作するwww-dataユーザの権限で書き込めないといけないのに、Debianでは所有者がrootになっている。

だから、chownしておかないと、cg-push したときに

Unable to lock remote branch refs/heads/master

と怒られる。

Tags: SCM
[]