Gitサーバ構築と基本的なコマンド備忘録

   2017/05/04

普段仕事ではsubversionを利用していますが(過去のしがらみもあり。)、もっぱらプライベートではGitを使ってます。 今回は、今更ですが自己管理のプライベートサーバにgitサーバを構築するところから、gitの基本的なコマンドを備忘録として書き留めました。 以下の環境で構築しています。

  • CentOS6.8 x86_64
  • git 1.7.1

Install

Gitサーバを構築するサーバ上で、gitをインストールします。

# yum install git
# yum install git-daemon
# yum install git-all

設定

xinetdの設定ファイル編集と起動

コミットするタイミングで構築したサーバにGitサーバを起動するようにxinetdの設定を変更します。 /etc/xinetd.d/gitというファイルが上記yumのインストールで作成されていますので、このファイルを編集します。

service git の設定内にある disable を no にします。 また、server_argsにしていしてあるオプションを以下のテーブルにまとめました。

--base-path Gitサーバのrootパスのようなもので、全てのリクエストがこのpathに再マップされます。
--export-all  base-pathの配下にあるGit レポジトリらしいディレクトリ(objectsとrefsディレクトリが存在する)からのpullアクションを許可する。
--user-path  ~/user を使ったリクエストを許可する。 pathを指定しないで設定すると、リクエストは ユーザのhomeディレクトリ直下のリポジトリへアクセスすることになる。 pathを指定すると同じリクエストが、home/pathの下にあるリポジトリへアクセスすることになる。
--syslog  標準エラーではなくsyslogへエラーを吐くようにする。
--inetd  サーバをinetdサービスとして起動する。
--vervose  ログを詳細に出力する。接続情報とリクエストされたファイル名をログに含む。

xinetdを起動するよう設定すればOKです。

# service xinetd start
# chkconfig xinetd on

Gitサーバのリポジトリを作成する

上記設定ファイルのserver_argsで指定したbase-pathにリポジトリを作成します。

# cd /path/to/your_dir
# mkdir -p public_git/my_first_git
# git --bare init --shared

--bareオプションは、そのディレクトリをベア(bare)リポジトリにするオプションです。リポジトリには「ノンベアリポジトリ」と「ベアリポジトリ」があり、違いは次の通りです。

  • ノンベアリポジトリ

作業ファイルそのものが存在するディレクトリであり、通常ユーザの作業ディレクトリになります。

  • ベアリポジトリ

逆に作業ファイルは置かれないディレクトリでファイルの更新管理に必要なファイルやディレクトリのみが置かれるリポジトリになります。

--sharedオプションは、作成された管理ファイルやディレクトリにグループで書き込み権限を与えます。 サーバ側のリポジトリは通常ユーザが作業しませんのでbareオプションを付け、複数ユーザが利用できるようsharedオプションも付けて作成します。 bareオプションを付けないで「git init」とした時は、そのディレクトリ内に「.git」という隠しディレクトリができ、そこに管理ファイルが置かれます。 bareオプションを付けると、そのディレクトリにそのまま管理ファイルが作成されます。 作成される管理ファイルでの唯一の違いは、configファイルの内容のようです。

ノンベアリポジトリの場合のconfigファイル
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
sharedrepository = 1
[receive]
denyNonFastforwards = true
ベアリポジトリの場合のconfigファイル
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedrepository = 1
[receive]
denyNonFastforwards = true

複数ユーザで利用できるようグループユーザ作成

# groupadd git
# usermod -G git user_name

そしてpublic_git/my_first_gitディレクトリ内をこのgitグループユーザから書き込みできるように権限を変更します。

# chown -R root:git public_git/my_first_git

これでサーバ側が完了になります。 当然ですが、このリポジトリにアクセスする必要があるユーザアカウント毎にgitグループユーザに入れます。

Gitクライアントにローカルリポジトリ作成

クライアント側は、gitが入っていればOKです。

# yum install git

まず、作業ディレクトリを作成しその中で、ノンベアリポジトリを作成します。

$ git init

ローカルリポジトリでファイルを作成してコミット

管理したいファイル(ここでは、test.cppとします。)を作業ディレクトリで作成します。 作成したらローカルリポジトリに追加。

$ git add test.cpp

次にローカルリポジトリにコミット。

$ git commit -m”my first file to test git” test.cpp
[master (root-commit) 3ef8fdb] my first file to test git
Committer: hoge <hoge@engineerspirit.(none)>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:git config –global user.name “Your Name”
git config –global user.email you@example.comIf the identity used for this commit is wrong, you can fix it with:git commit –amend –author=’Your Name <you@example.com>’1 files changed, 156 insertions(+), 0 deletions(-)
create mode 100644 test.cpp

ローカルからリモートリポジトリへのPush

「remote add」でリモートリポジトリをローカルconfigファイルに登録します。

$ git remote add remote1 ssh://hoge@hostname.com/path/to/your_dir/public_git/my_first_git

すると .git/config ファイルに次のように書き込まれます。

[remote “remote1”]
url = ssh://hoge@hostname.com/path/to/your_dir/public_git/my_first_git
fetch = +refs/heads/*:refs/remotes/remote1/*

これで、ローカルリポジトリにコミットしてあるファイルをリモートリポジトリにPushするには、

$ git push remote1 master
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 1.71 KiB, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://hoge@hostname.com/path/to/your_dir/public_git/my_first_git
* [new branch] master -> master

まとめ

これでローカルリポジトリに登録してコミット、そしてリモートリポジトリに転送できるところまでができました。 まだまだここにあげたコマンドだけでは、不十分ですが、長くなってきたので、ここで基本は終わり(適当。。。)ということにして次回に詳細に操作コマンドをまとめます。 個人的にコマンド覚えて、操作できるだけでは、何がどうなってるか分からないので気持ち悪い。 大事なファイルを管理するには不安が残りますので、ファイルが登録されコミットされていく際に何が起きているか次回細かく紹介します。

 

  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら