Git

httpsでgitサーバを立てて複数人でいじれるとこまで行いました

More than 1 year has passed since last update.

Gitを導入してみました。かなりの数の人が使っているので、簡単なのかなと思っていたら意外とハマってしまいました。。
自分なりに導入した手順をメモします。
プロトコルはhttpsでCentOSにリポジトリを入れてgitサーバを立ち上げます。

gitサーバの構築

まずはgitサーバへのgitインストール
これは簡単でした。

yum install git

httpd.confの設定
/etc/httpd/conf/httpd.confに以下のようなAliasを作ってLocationを以下のように設定

httpd.conf
Alias /git /var/lib/git
<Location /git>
   DAV on
   SSLRequireSSL
   AuthType Basic
   AuthName "Git Repository"
   AuthUserFile /var/lib/git/htpasswd
   Require valid-user
</Location>

/gitはhttpsからアクセスされるurlの一部です。例)https://www.xxx.jp/git/
/var/lib/gitはgitのリポジトリを格納するフォルダになります。
/var/lib/git/htpasswdはhttpのBasic認証で使用するファイルです。htpasswdコマンドでIDとパスワードを設定してください

リポジトリの作成
gitのリポジトリを登録。名前はとりあえずhogeと

$ git init --bare hoge
$ chown -R apache:apache hoge

ここまではなんだ全然、余裕じゃんと思っていたのですが、こっからハマりました。

まずはcloneしようとして、

~ git clone https://www.xxx.jp/git/hoge
fatal: unable to access 'https://www.xxx.jp/git/hoge.git/': SSL certificate problem: unable to get local issuer certificate

まあ、こうなりますよね。オレオレ証明書じゃダメだと。
とりあえず、本番用の証明書は置いておいて
.gitconfigに

[http]
    sslVerify = false

を追記。これでとりあえず先に進めるな。と思ったはいいが、別のエラーが

git clone https://www.xxx.jp/git/hoge
error: The requested URL returned error: 401 Authorization Required while accessing ...

となりました。はい。Basic認証しているので認証をしなければなりません。
ここでちょっとgitのバージョンによって動作が変わります。
ver 1.7.1 だとurlをgit clone --vare https://[user名]@www.xxx.jp/git/hogeとしないと動きません。
cygwin上のgit(version 2.8.3)では、対話形式でUsernameとPasswordで聞いてきますが1.7.1の場合明示的にurlに埋め込む必要があります。
でも、こういうところで毎回パスワードを入力するのは面倒なので

git clone https://[user名]:[pass]@www.xxx.jp/git/hoge

とついでにパスワードも設定しておきます。
気を取り直してもう一度clone

~ $ git clone https://www.xxx.jp/git/hoge
fatal: https://[user名]:[パスワード]@www.highwide.jp/git/bb/info/refs not found: did you run git update-server-info on the server?

は?
cloneが失敗してしまいました。
git update-server-info
実行しろよみたいなエラーですね
なのでgit update-server-infoを実行します

~$ git update-server-info

とコマンドを打たなきゃダメらしい。しかも毎回。
毎回は面倒なので

mv hoge/hooks/post-update.sample hoge/hooks/post-update

としておきます。さて準備が整ったのでclone

~ $ git clone https://www.xxx.jp/git/hoge
Cloning into 'hoge'...
Username for 'https://www.xxx.jp':
Password for 'https://o-ta@www.xxx.jp':
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

よし 成功!
では軽く某かのファイルをcommitしてpushしてみるかと

~/hoge $ echo a > a
~/hoge $ git add a
~/hoge $ git commit -m 'init'

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address

おっとそういえばidとmailを設定してなかったなと

$ git config --global user.email "YamadaKun@gmail.com"
$ git config --global user.name "YamadaKun"

よし、今度こそ

ダメでした

~/hoge $ git commit -m 'init'
[master (root-commit) 38090ae] init
 1 file changed, 1 insertion(+)
 create mode 100644 a
~/hoge $ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
Everything up-to-date

commitまでは正常に動いており、pushで躓いているみたいです。
調べた結果
何もない、まっさらなリポジトリでは

git push origin master

を実行していないとダメだとのことです。

これでようやくpushすることができました

$ git push origin master
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
updating 'refs/heads/master'
  from 0000000000000000000000000000000000000000
  to   04829bac3e1ad317e99c619b73f198434b54dfea
    sending 3 objects
    done
Updating remote server info
To https://www.xxx.jp/git/bb
 * [new branch]      master -> master