カテゴリーアーカイブ: git

プライベートなgitサーバーを立てたいのだけど、git:// とかではなく、ssh:// でやりたいなーと思いまして。

なのでgit-daemonは使わず、gitosisを使ってみたいと思います。
つまり、公開鍵だけもらってユーザー毎にアクセス権限管理とかしたいわけです。

個人的用途なのにアクセス権限とか・・どういうことなの・・・

webのインターフェイスは今のところ考えていません。

“%”がリモートサーバーで“$”がローカルPCのプロンプトです。

サーバーにyumからインストールしてgitosisの初期設定をします。

% yum update git
% yum install gitosis
% useradd git
% passwd git
% cd /home/git
% sudo -H -u git gitosis-init < id_dsa.pub
Initialized empty Git repository in ./
Reinitialized existing Git repository in ./
% ls -la
gitosis/
.gitosis.conf
repositories/
.ssh/

自分のPCでgitosis-adminをgit cloneします。

$ git clone ssh://git@example.com/gitosis-admin.git
$ cd gitosis-admin
$ ls
gitosis.conf keydir

リポジトリ管理者を追加します。基本的に自分だけ。複数ユーザを設定できます。必要なものは公開鍵で、これをpushすることになります。

$ vi gitosis.conf
[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = runeleaf fuga

$ cp id_rsa_fuga.pub keydir/fuga.pub
$ git add .
$ git ci -m 'add admin'
$ git push

うまいことhooks/post-updateで.sshに公開鍵を追加しているんですね。

個人で使うリポジトリを追加してみます。

$ vi gitosis.conf
[group fuga]
writable = foo/bar/baz
members = fuga

$ git add .
$ git ci -m 'add private repo'
$ git push

自分のPCで試しに作ってpushしてみます。

$ cd ../
$ mkdir my-repo
$ cd my-repo
$ git init
$ cat > README
test
$ git add .
$ git ci -m 'init'
# gitosis.confにwritable(foo/bar/baz)を追加しておく
$ git remote add origin ssh://git@example.com/foo/bar/baz.git
$ git push origin master

ここまでやれば大体良かったのですが、gitサーバー自身にgit cloneしようしてもうまい事できなかったので(なんかもっと良い方法がありそうだけど)、自分自身でも同じようにgit cloneしたりpushしたりできるようにしてみます。

ようはローカルでしか使わない鍵をつくっただけ。

% ssh-keygen -P "" -t dsa -f id_dsa_local
% mv id_dsa_local .ssh/
% vi .ssh/config
Host example.com
  User git
  Hostname localhost
  IdentityFile ~/.ssh/id_dsa_local

作成した公開鍵、id_dsa_local.pubの内容をコピーするかローカルマシンにダウンロードして追加。

$ cd gitosis-admin
$ cp ~/id_dsa_local.pub keydir/local.pub
$ vi gitosis.conf
[group fuga]
writable = foo/bar/baz test/lib
members = fuga local
$ git add .
$ git ci -a -m 'add local'
$ git push origin master

これでgitサーバー自身にログインしてローカルマシンと同じようにcloneしたりpushしたり。

% git ssh://git@example.com/test/lib.git test-lib
% cd test-lib
% touch test.txt
% git add .
% git ci -a -m 'add test.txt'
% git push

こんなんでいいのかなぁ・・

自分しか使わないし、いいよね。

git add . したファイルをやめる。

git rm --cached test.txt

gitはファイル単位じゃないので無理っぽい。

一応できるっちゃできるけれど、

# git commit -F hoge.txt

git logのコメントがファイルの内容とかだった。

うへー

ふつうにdcommitしたら、

% git svn dcommit
Cannot dcommit with a dirty index.  Commit your changes first, or stash them with `git stash'.

とかおこられた。

一応できるようなので、

# git stash
# git svn dcommit
# git stash apply

これでできたけど、めんどくさいよ・・