山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

ロカール PC に Git 共有リポジトリを作成

数人でソースを共有するため、自分の PC を Git の共有リポジトリとして提供する方法を書いておきます。

前提として Apache HTTP Server と Git はインストールしておく必要があります。

Apache 2.4 のインストールは以前記事にしていますので参考にしてください。
www.shookuro.com

バージョン

OS : Windows 10
Apache : 2.4.41
Git : 2.23.0

共有リポジトリの作成

まず、Git コマンドで公開する共有リポジトリを作成します。

共有リポジトリは複数人でアクセスする可能性があるため、実ファイルを置かない「ベアリポジトリ」というタイプで作成します。

参考:
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordpressのテーマを管理 - トリコロールな猫

コマンドプロンプト(または Git Bash)を使用して以下のコマンドを打ちます。Git Bash の場合はコマンドが少し異なる箇所があるかもしれません。

D:\yyama\repository>mkdir git-sample.git

D:\yyama\repository>cd git-sample.git

D:\yyama\repository\git-sample.git>git init --bare --shared
Initialized empty shared Git repository in D:/yyama/repository/git-sample.git/

D:\yyama\repository\git-sample.git>git config http.receivepack true

「D:\yyama\repository」が git 管理させるプロジェクトのリポジトリを(複数)格納するための親フォルダ。

「git-sample.git」は今回作成するプロジェクトのリポジトリです。ベアリポジトリは慣例でフォルダ名末尾に「.git」を付けます。

「git init --bare --shared」 でフォルダを git 管理下に置きます。

オプションの説明についてはこちらの記事がわかりやすいです。
Githubを使わずにチームでGitを共有する方法 - Qiita

最後の「git config http.receivepack true」ですが、これを忘れると push を拒否してしまいます。
その時のエラーメッセージは下記。

fatal: unable to access 'http://xxx.xxx.xxx.xxx/git/git-sample.git/': The requested URL returned error: 403

Apache の設定

httpd.conf の設定を変更し、HTTP アクセスで Git リポジトリの操作を行えるようにします。

本来なら共有リポジトリにアクセスする際、ユーザ認証させる必要があり、 Apache の設定ファイル等で認証設定も行います。

今回はインターネットに公開していないローカルネットワークで数人だけがアクセスするので省略しています。

httpd.conf に以下の記載を追加します。

SetEnv GIT_PROJECT_ROOT "D:/yyama/repository"
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ "C:/Program Files/Git/mingw64/libexec/git-core/git-http-backend.exe/"
<locationMatch "/git">
    Require all granted
</locationMatch>

削除、変更した箇所はありません。追加だけです。(Apache のバージョンにもよると思いますが。)

一行ごとに解説します。

SetEnv GIT_PROJECT_ROOT "D:/yyama/repository"

プロジェクトのリポジトリを(複数)格納するための親フォルダを指定します。
 

SetEnv GIT_HTTP_EXPORT_ALL

ここに解説が出ているので引用します。
Git - Smart HTTP

環境変数 GIT_HTTP_EXPORT_ALL を設定しない場合、クライアントからのアクセスは読み込み専用になり、読み込めるのは git-daemon-export-ok ファイルが保存されたリポジトリだけになります。Git デーモンと同様の挙動です。

最後に「1」を指定する必要があるというサイトも見ましたが、無くても動きました。
 

ScriptAlias /git/ "C:/Program Files/Git/mingw64/libexec/git-core/git-http-backend.exe/"

「/git」にアクセスがきた場合に実行する CGI (実行プログラム)を設定します。Git のインストールディレクトリによってパスを書き換えてください。最後のスラッシュも必要です。
 

<locationMatch "/git">
    Require all granted
</locationMatch>

「/git」に対するアクセスはすべて許可します。(ほんとうは認証機能を使って特定の人しかアクセスできないようにしたほうが良いですよ。)
 
設定は以上です。Apache を再起動しましょう。

動作確認

別のディレクトリに clone して push してみました。

D:\yyama>mkdir D:\yyama\local_repo

D:\yyama>cd D:\yyama\local_repo

D:\yyama\local_repo>git clone http://127.0.0.1/git/git-sample.git .
Cloning into '.'...
warning: You appear to have cloned an empty repository.

D:\yyama\local_repo>echo > aaa.txt

D:\yyama\local_repo>git add .

D:\yyama\local_repo>git commit -m "初回コミット"
[master (root-commit) a15440f] 初回コミット
 1 file changed, 1 insertion(+)
 create mode 100644 aaa.txt

D:\yyama\local_repo>git push --set-upstream origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://127.0.0.1/git/git-sample.git
 * [new branch]      master -> master

想定通り動きました。

以上です。おつかれさまでした!

サルでもわかるGit入門

サルでもわかるGit入門

独習Git

独習Git

  • 作者:リック・ウマリ
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/02/26
  • メディア: 大型本
初めてのWebサーバ「Apache」CentOS 7編 (NextPublishing)

初めてのWebサーバ「Apache」CentOS 7編 (NextPublishing)

  • 作者:大津 真
  • 出版社/メーカー: インプレスR&D
  • 発売日: 2017/05/26
  • メディア: Kindle版