クラなんとか or くらなんとか or cla なんとかの日記

2011-01-09

Redmine で gitolite のリポジトリを扱いたい - 現状の確認

Redmine の lib/redmine/scm/adapters/git_adapters.rb を見ると,

基本的には,git コマンドで --git-dir 指定をして使っているような気がする.

$ egrep 'cmd = ' lib/redmine/scm/adapters/git_adapter.rb|perl -pe 's/^\s+//'
cmd = "#{GIT_BIN} --git-dir #{target('')} branch --no-color"
cmd = "#{GIT_BIN} --git-dir #{target('')} tag"
cmd = "#{GIT_BIN} --git-dir #{target('')} ls-tree -l "
cmd = "#{GIT_BIN} --git-dir #{target('')} log --no-color --date=iso --pretty=fuller --no-merges -n 1 "
cmd = "#{GIT_BIN} --git-dir #{target('')} log --no-color --raw --date=iso --pretty=fuller "
cmd = "#{GIT_BIN} --git-dir #{target('')} diff --no-color #{shell_quote identifier_to} #{shell_quote identifier_from}" 
cmd = "#{GIT_BIN} --git-dir #{target('')} show --no-color #{shell_quote identifier_from}"
cmd = "#{GIT_BIN} --git-dir #{target('')} blame -p #{shell_quote identifier} -- #{shell_quote path}"
cmd = "#{GIT_BIN} --git-dir #{target('')} show --no-color #{shell_quote(identifier + ':' + path)}"

git の --git-dir オプションは,ローカルリポジトリの .git ディレクトリを指定して,

カレントディレクトリじゃない場所に対してコマンドを実行するものと思えばいい.*1

なので,一応パスから変換して,ローカルのファイルシステムに git clone するようにすれば,

リモートリポジトリを指定して対応できるような気がするけど,

現状はそうなってないのかな?

テストが,test/unit/lib/redmine/scm/adapters/git_adapter_test.rb にあるようだ.

なんか,この辺を要求されたりした.

$ gem install mocha
$ gem install edavis10-object_daddy
$ gem install -v=2.10.3 shoulda

参考

で,target() とかは,lib/redmine/scm/adapters/abstract_adapter.rb を読む流れか.

とりあえず,git clone --mirror すれば,bare リポジトリができるので,

git fetch をcron すれば一応できることは確認できた感じ.

hook かけるのかなー.

*1:bare リポジトリだと使えない?

2010-12-29

gitolite を試す

gitolite のがgitosis より簡単らしい.

branch とかへのアクセス制限もできるようだ(2010/12/30 追記)

Personal なブランチの名前空間をサポートもしてるようだ(2010/12/30 追記)

git$ mkdir -p $HOME/gitolite/bin $HOME/gitolite/conf $HOME/gitolite/hooks
git$ cd modules
git$ git clone git://github.com/sitaramc/gitolite gitolite-source
git$ cd gitolite-source
git$ src/gl-system-install $HOME/gitolite/bin $HOME/gitolite/conf $HOME/gitolite/hooks
git$ cd $HOME
git$ export PATH=$HOME/gitolite/bin:$PATH
git$ gl-setup $HOME/.ssh/clairvy.pub
git$ vi .bashrc
<$HOME/gitolite/bin をPATH に追加>

PATH の件を追記 (2011/01/05 追記)

これで,アクセスできるようになるみたい.

試す

$ ssh git@remote-host.domain
PTY allocation request failed on channel 0
hello clairvy, the gitolite version here is v1.5.8-1
the gitolite config gives you the following access:
     R   W      gitolite-admin
    @R_ @W_     testing
Connection to localhost closed.
$ git clone git@remote-host.domain:gitolite-admin.git

gitosis と同じように,管理はgitolite-admin リポジトリを触るみたい.

あと,conf を書くと空repository を作ってくれるみたい.

これは来年試そう.*1

ご参考

ということで追記.(2010/12/30)

gitolite/gitosis 共に .ssh/authorized_keys にログインユーザ設定をすると考えればいいみたい.

ssh git@rmote-host.domain したときに,コマンドが動く設定をしてるのかな?

なので,それを無効にしたかったら,その辺をなんとかすればいい.*2

あと,各リポジトリの hooks は,絶対パスで シンボリックリンクされるので,

$HOME/gitolite/hooks 的な場所に位置が変更になったらその辺に注意.

なんかこう.$HOME/gitolite 配下で色々クローズする方が移動できて楽かもしれないけど,

$HOME/.gitolite.rc で $HOME/repositories の位置を制御したりすればできるのかな?

あと,多分 $HOME/.gitolite/{keydir,conf} が現在の設定なので,その辺を直接イジることもできる.

普通はプッシュするだろうけど,設定ミスったときとかに.*3

*1:$HOME/gitolite/bin にパスが通っていないと new repo を作ってくれないよう.パスさえ通せば自動的に作ってくれる

*2:gitosis と gitolite で同じユーザでやってたので,ここでハマった

*3:というかミスりました

2010-12-26

gitosis を試す

メモ的に

まず git ユーザを作り終わっているとします.

$ sudo su - git
git$ git clone git://eagain.net/gitosis.git
git$ easy_install-2.6 --user gitosis
git$ cd ~/local/bin
git$ ln -s ~/.local/bin/* .
git$ rehash
git$ cd
git$ ssh clairvy@localhost cat .ssh/id_rsa.pub | gitosis-init

試す.

$ git clone git@localhost:gitosis-admin.git

*1

とりあえず,できたみたいだけど,リモートから触ってないので,

まだわかんない感じ.

別の場所に設置して試します.

ご参考

運用としては,gitosis-admin リポジトリを編集+手 or スクリプトなんかなー.

新リポジトリ作るのとか.その辺はおいおい試します.

github みたいに楽にするにはまだ補助が要るんかなー?

*1:パスが通ってなかったっぽいので,gitosis-serve を/usr/bin にシンボリックリンクしました

2010-10-09

Git-Http をやってみた

ようするに,以下が必要らしい.

  • WebDAV
  • Git --bare 的なもの
  • git server-update

Apache 側は

  • ロケーションに対して DAV on する
  • passwd (Auth)
$ cd /etc/apache2
$ vi httpd.conf
$ git diff httpd.conf
-#Include /private/etc/apache2/extra/httpd-dav.conf
+Include /private/etc/apache2/extra/httpd-dav.conf

*1

repository 側は,

  • hooks/post-update - update-server-info
$ mkdir ~/Sites/my-new-repo.git
$ cd !$
$ git init --bare
$ cp hooks/post-update.sample hooks/post-update
# 最初から update-server-info の設定になってる!
$ vi .htaccess
$ cat !$
AuthType Basic
AuthName "Git"
AuthUserFile /Users/clairvy/Sites/my-new-repo.git/passwd
Require valid-user

最初 info/refs が無くてなんでやねん.

と思っていたら.単に typo していただけだったという.

参考

*1:なんかコマンドで a2e 的な有効にしたりするのかなぁ?

2010-09-22

Git 勉強会に行ってきたよ

会では全然Git の話とかしてなかった気もしましすが,

なんか名指しされたので Git 関連の今の自分の設定的な話を

一回まとめて晒しておこうかな.と思います.

最初に設定するような人は参考にしてもいいかもしれません.

自分は Zsh と Emacs 派なので,Git 関連は以下を使っています.

  • .gitconfig のalias
  • Zsh の補完機能
  • Zsh のプロンプト変更機能(vcs_info)
  • Emacs (Egg.el)
  • gisty - gist へポストするコマンドラインツール

.gitconfig の alias

Git はデフォルトだと短いサブコマンドが使えません.

そこでSubversion でも使っていた感じで使えるよう適当にalias しています.

# $HOME/.gitconfig
[alias]
        st = status
        ci = commit
        co = checkout
        br = branch
	dif = diff

diff は,di だと ci を打ち間違えそうだし,df だと

イメージとして df コマンドが思い浮かぶので,dif と

あまり短くない感じになっています.

この辺は好みで.

Zsh の補完機能

Zsh は補完機能が豊富なので,とりあえず compinit だけでも使えます.

#!/usr/bin/env zsh
# .zshrc の設定

# 補完設定
autoload -Uz compinit; compinit

# 自前で用意した関数用の設定
typeset -U fpath
fpath=(~/.zfunctions/Completion ${fpath})

自分の場合は,最近 git submodules を覚えたので,

それ補完してくれる設定を使っています.

それについては d:id:clairvy:20100909:1283982598 を参照のこと.

で,良いのを見付けたので,http://gist.github.com/591626

使おうと思っています.これを.zshrc からロードするようにすればOK.

$HOME/.zfunctions/Completion/_git

ファイルを置いています.

vcs_info - プロンプトに branch 名を表示

トピックブランチを切るようになると,ブランチをコロコロ切り替えるので,

現在の居るブランチを知りたいと思うようになります.

git br で毎回調べるのもいいですが,

Zsh ならプロンプトに出しておくのもいいでしょう.

#!/usr/bin/env zsh

# プロンプト用
setopt prompt_subst
autoload -U colors; colors

if [[ $ZSH_VERSION == 4.3.* ]]; then # 今だとあまり無いけど,一応古いもの対策
  autoload -Uz vcs_info
  zstyle ':vcs_info:*' formats '(%s)-[%b]'
  zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
  precmd () {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
  }
fi

参考

  • man zshcontrib

以前,一つ前のブランチに戻りたいという要望を見た気がするので,

cd - 的な git co - 的な機能もあってもいいかなー.と

今妄想中だったりします.

と思って検索したらあったので設定しました.

これは,submodule の設定も含んでいるので,.zshrc からロードしています.

参考

Egg

Emacs は Egg.el を使っています.

コマンドラインで Chunk を扱うコマンドは全然覚えてませんが,

一部をstaging したり,undo するときには結構便利に使っています.

;;; git(egg)
(setq egg-git-command "/opt/local/bin/git") ; MacPorts 版の git を使う
(setq load-path (cons (concat home "/.emacs.d/egg") ; egg へのパス
                      load-path))
(require 'egg)

上記設定で,M-x egg-status で差分が出るので,

その変更に対して,staging したりコミットしたりできます.

C-x v b でブランチ作成とか,C-x v ~ でチェックアウトとかできるけど,

自分はコマンドラインで確認しながらやることが多いです.

gisty

gist を使うときには,コマンドラインで gisty というコマンドを使っています.

これを使ってpost してから,更に変更を加えて,

というパターンが多いです.

gisty も補完してくれるよう設定してあります.

が $HOME/.zfunctions/Completion/_gisty に置いてあります.

参考