Gitを導入してみました。かなりの数の人が使っているので、簡単なのかなと思っていたら意外とハマってしまいました。。
自分なりに導入した手順をメモします。
プロトコルはhttpsでCentOSにリポジトリを入れてgitサーバを立ち上げます。
##gitサーバの構築
まずはgitサーバへのgitインストール
これは簡単でした。
yum install git
httpd.confの設定
/etc/httpd/conf/httpd.confに以下のようなAliasを作ってLocationを以下のように設定
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