Fri, 19 Mar 2010

Git hookと、HgからGitへの変換

gitのhookを使ってみた

やりたいのは、下記の3つのリポジトリがあって、

  • bare
  • remote1
  • remote2

remote1を編集してbareにpushしたらremote2にもその変更を反映させたい。

bareからremote-bにpushする方法だと、remote2側でreset等を実施しない限りファイ ルが更新されないので、その方法ではうまくない。

ということで、bareリポジトリにpushされたらそれをトリガに、remote2側からpullす ることにする。

bare/.git/hooks にあるpost-receive.sampleをpost-receiveに名前を変える。 hookのタイミングとしてはpost-updateでもいいらしいが、こっちは使うなと書いてあ るのでpost-receiveを使うこととする。

# post-receive
BARE_DIR=$PWD
cd remote2_dir
git --git-dir=.git pull $BARE_DIR

--git-dir=.git 重要。これでかなりはまった。

参考: @ Git で集中リポジトリーに push したら、自動でワーク・ディレクトリーにも反映させる

追記:今探したらそのものずばりのがみつかった。。。なんという。

フック(hook)を使ってコミットしたら自動的にデプロイするようにする - チナミニ


Hgからgitへの変換

ちょっと前までMercurialを使ってきたが、最近をgitを使うようになったらMercurial の使い方を忘れてきてしまって使いにくくなってしまったので、Mercurialのリポジト リをGitのリポジトリに変換してみた。

hg から git へファストエクスポート にあった"fast-export" を使ってみた。

最初Mercurialのリポジトリで、git initして、そこでhg->git変換を実施したらファイ ルがざくざく消えていってびっくりした。

なので、Mercurialのリポジトリとは別の場所にgit用のディレクトリを作って、そこに 変換した方がいい。

hg-fast-export.txtには、hg-reset.shがどうとか書いてあるけどこれはよくわからな いし、使わなかった。

> hg clone xxxx-hg
> mkdir xxxx-git
> cd xxxx-git
> git init
> hg-fast-import.sh -r ../xxxx-hg

> ls
.git

.git以下が作成されるだけなので、以下の用にcloneして使った。

> cd ..
> mkdir git-remote
> cd git-remote
> git clone ../xxxx-git

と、まぁこんな感じ。


Thu, 05 Jun 2008

MercurialのUpdate

ns9logさんの所hgutils.vim を公開されているMercurialのページが格好いい。

単にMercurialを1.0.1にupdateしたらいいのかと思ったらどうやらそうではないらしい。

helpやらを探していたらみつけた。hgweb.configには下記設定を、

[web]
style = gitweb

各公開ディレクトリの.hg/hgrcファイルに下記のように記述するといいらしい。

[web]
style = gitweb
allow_archive = gz, zip

allow_archiveにて、最新バージョンを固めたものがダウンロードできるようになる。 素晴しい。早速自分のも対応させてみました。

  • 適用前
mercurial old style
  • 適用後
mercurial gitweb style

Sun, 01 Jun 2008

vimとかもろもろメモ

au BufWritePost *.py :silent !chmod a+x <afile>


Continue Reading...: "vimとかもろもろメモ"



Thu, 18 Oct 2007

ssh経由でmercurialのリモートリポジトリを更新

せっかくmercurialをアップデートしたので、ssh経由でリモート/ローカルでのリポジト リの同期を試してみようと JapaneseMultipleCommitters - Mercurial の「SSHでユーザごとのアカウントを利用する(訳者による追加)」を参考にアクセスしてみた。

% hg clone ssh://user_name@xxx.xxx.xxx//home/xxxx/xxx
remote: zsh: command not found: hg
abort: no suitable response from remote hg!

hgコマンドなんて知りませんって。

色々調べてたら、sshでリモートからコマンドを実行する時には、 $HOME/.xxxファイル は読み込んでくれないんだね。hgコマンドは、 $HOME/local/bin/hg に置いてあって .zshrcにてPATHに追加してるので、そんなん知らないって言われちゃってると。

sshd_configのmanとか見ると、PermitUserEnvironmentが有効なら、 $HOME/.ssh/environment とかにPATHを追加したらいけそうなことが書いてあったので試してみたけど、どうやら駄 目っぽい。まぁレンタルサーバだし有効じゃぁないわな。 /etc/ssh/sshd_config はPermission deniedで見れなかったのでわからんけど。

で、じゃあどのPATHなら有効なんだろうと思って、下記コマンドを実行してみたところ、 うちのレンタルサーバでは、 $HOME/bin がユーザ用のPATHとして設定されていた。

ssh user_name@xxx.xxx.xxx 'echo $PATH'

では、ということで早速 $HOME/local/bin/hg から $HOME/bin/hg へとリンクを 張ってリトライ。

% hg clone ssh://user_name@xxx.xxx.xxx//home/xxxx/xxx
remote: Traceback (most recent call last):
remote:   File "/home/xxx/bin/hg", line 4, in ?
remote:     import pkg_resources
remote: ImportError: No module named pkg_resources
abort: no suitable response from remote hg!

あれ?今度はpkg_resourcesモジュールが見つからんとな。あぁ、これも.zshrcに PYTHONPATHとして、 $HOME/local/lib/python/site-packages を設定していた。

うーん、これはどうしたもんかな?とちょっと悩んだけど普通のモジュールと一緒でスク リプトの先頭に import user を追加したら良かった。これで無事にローカルホストか らリモートホストのリポジトリにアクセスできるようになりました。

こんな感じ。

% hg clone ssh://user_name@xxx.xxx.xxx//home/xxxx/xxx
destination directory: xxx
requesting all changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

ローカルリポジトリの変更をリモートリポジトリに反映するには、ローカルリポジトリで ファイルを修正し、 hg ci した後に、 hg push とする。

上記でサーバ側からcloneした時点で、 ローカルリポジトリ/.hg/hgrc

[paths]
default = ssh://xxx.xxx.xxx//home/xxxx/xxx

とリモートリポジトリのpath情報が書かれているので、単に hg push とやったら 良かった。

% hg push
pushing to ssh://user_name@xxx.xxx.xxx//home/xxxx/xxx
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

一人でやるならこれで十分かな。でもやっぱり複数人で共同作業するなら(今のところ予 定ないけど)HTTP経由でやれた方が便利だよね。

steps to phantasien t(2007-05-19) にある.htaccessの設定を再度見直してみる。

あ、なるほどPOSTだけ限定でアクセス制限かけたらいいのか。なんとなくアクセス制限か けちゃうとアカウント登録しないと見ることもできないのか、それはさすがに不便だよな 、って思いこんじゃってました。そうかそうか、これならこの方法は便利そうだね。

共有する機会があったら試してみよう。


Tue, 16 Oct 2007

mercurialをアップデート

日本語ファイルを登録してhttp経由で見たんだけど文字化けしまくりだ。

あれれ?手元にあったmercurial v0.9.1では検索してもcharsetにあたる記述がどこにも ないぞ。えー設定できない?自分で文字コード設定するようにしないといけないの?と思 ったが最新版v0.9.4を見るとちゃんと設定できるようになっていた。ただしファイルごと に文字コードを設定するってことはできなさそうだけど、単一の文字コードを使う分には 問題ないしね。

ということでupdate。前に何をしたかすっかり忘れちゃったので、今回もすぐ忘れるだろ うからメモっておこう。

  1. mercurial-0.9.4.tar.gzをdownloadしてきてインストールする
「$ easy_install mercurial」 ってしてもいいんだけど、そうすると(2)で困るので tarballで持ってきた。
  1. 解凍したディレクトリにあるhgwebdir.cgiをサーバのcgiディレクトリへコピーする
  2. 「import user」を先頭の方に追加

この設定がしてあるため「import user」とすることでPYTHONPATHが有効になる

  1. import os; os.environ["HGENCODING"] = "UTF-8" を有効にする
  2. hgwebdir.cgiと同じディレクトリにhgweb.configを置いて下記の用に公開したいレポジトリを記述する
[paths]
repository1 = /usr/local/share/repo1
repository2 = /usr/local/share/repo2/subtree/hoge

6. これでブラウザでhttp://xxx/hgwebdir.cgiにアクセスできる。後は各レポジトリのディレクトリ ごとに、/xx/xx/.hg/hgrcに設定を書く

[web]
description = レポジトリ一覧に表示される説明文
  1. またローカル環境にもmercurialが入っていれば下記コマンドでローカルリポジトリを作成できる
$ hg clone http://xxx/hgwebdir.cgi/repository1

後は下記にあったように、http経由でpushしたいな、と。

確かに「allow_push = *」ってやればいけるけど、どうせならここにユーザ名を指定し てみたいと思ってちょっと試したんだけど、もうひとつうまくいかないな。

.hgrc - Mercurial

どうやるんだろ?