AIXにGitサーバーを構築した流れ

前回の記事である[ネット環境のないAIX7.1にGitを導入し使えるようにするまで（YUMを使わずに）](https://qiita.com/mkzyk/items/f679b71c7bd74bc929b7)の続きです。
Gitをインストールしてから、使えるようにするまでです。（AIXと書いてますが別にubuntuでも他Linuxでも一緒だと思います）

普段はGitHub DesktopとGitHubしか使わないためにGitサーバーという発想は全くありませんでした。
しかしAIXが外に繋げないため、GitHubにpushしたソース類をAIX上でssh等でcloneすることは出来ないので
AIXをGitサーバー化させ、各自作業者のPCからpushして管理する案しか残らないのでした。

やりたいことのイメージ的にはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/ff5671b8-87f9-3b7d-5913-2f528799d21c.png)


どうやるの？って話ですが、`gitサーバー構築`とかでググると色々でてきますが一応書きます。
参考にさせて頂いた記事
- [gitのリモートプライベートリポジトリを公開鍵認証を使って環境構築する](https://joppot.info/2014/07/13/1722)

git-daemonを使用するのもアリだったのですがもう疲れていたのでまだちょっと知ってるssh接続を前提とします。

###ssh接続の設定（クライアント側）
まずは、各自ユーザーがssh公開鍵を作成しないとだめです。
詳細は、Git/GitHub公式のHow Toがあります。
- [Connecting to GitHub with SSH](https://help.github.com/en/articles/connecting-to-github-with-ssh)
- [Git サーバー - SSH 公開鍵の作成](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90)

自身はMac OSを前提として書きます。 （Windowsの場合はまずGitをインストールし、GitBash上で下記コマンドの入力をお願いします）

- 自身が公開鍵を持っているか確認する

```
.ssh $ cd
~ $ cd ~/.ssh
.ssh $ ls
config		id_rsa		id_rsa.pub	known_hosts
```

- 無い場合は、下記コマンドを行う

```
$ mkdir .ssh
$ cd .ssh
.ssh $ ssh-keygen
```

実行場所は、Macなら`/Users/xxxx/.ssh`
Windowsなら`C/Users/xxxx/.ssh`
xxxxは自分の名前。

鍵の保存先を求められるので、`.ssh/id_rsa`を指定する  
**パスフレーズも求められるが、それはEnterを押してとりあえず無で良い。** 

ここまで出来たら、上記のように`id_rsa`と`id_rsa.pub`が作成されているはず。
`id_rsa`は秘密鍵で、`id_rsa.pub`は公開鍵となります。
`id_rsa.pub`の内容を`cat`などで確認しておく。
 
###ssh接続の設定（サーバー側）
公式では`git`というユーザーを作成し、そのユーザーがgitレポジトリをアクセスできるようにしているので、
それを前提とします。

まず、下記を行います。（.sshディレクトリが無い場合）

```
$ mkdir /home/git/.ssh
```

適当にtmpディレクトリ等を`/home/git`に作成します。

```
$ mkdir tmp
```

先ほどの`id_rsa.pub`を`/home/git/tmp`に置きます。(FTPなどで）

`authorized_keys`を作成します

```
$ touch /home/git/.ssh/authorized_keys
```

`authorized_keys`に公開鍵の内容を書き込みます。

```
cat id_rsa.pub >> /home/git/.ssh/authorized_keys
```

**上記の`id_rsa.pub`をサーバーに置く、`authorized_keys`に内容を書き込む、はメンバー分行う必要があります。**
<font color="Red">すなわち、サーバー側の作業として、**セットアップを行う各メンバー**も上記作業だけは行なってください。</font>   
でないと、もちろんなんですがローカルPCから`git pull`を行う際に権限ないよ、って言われます。

###ベアレポジトリの作成
次にベアレポジトリと呼ばれるGitの更新情報等だけを保持するディレクトリを作成します。
ベアレポジトリとノンベアレポジトリについては下記記事がわかりやすかったです。
[gitのベアリポジトリとノンベアリポジトリ](https://qiita.com/devzooiiooz/items/56a02342d9d65d79f6c3)

これもサーバー側とクライアント側の作業があります

- サーバー側  

```
$ cd work
$ mkdir work.git
$ cd work.git
$ git init --bare --shared
```
`work.git`のディレクトリを作成することにより、gitにここはリモートレポジトリですよと教えてあげます。
そして`git init --bare`オプションにより、ベアレポジトリを新規に作成してもらいます
複数人で作業をする場合は、`--shared`オプションが必要です

- クライアント側 

``` 
$ mkdir work
work $ cd work
work $ echo "Hi this is local" > a.txt

work $ git init
work $ git add .
work $ git commit -m 'first commit'
```
クライアント側はベアレポジトリを作成というよりかは、
作業ディレクトリ（ノンベアレポジトリ）をポイントするようなイメージです。

###クライアントPCからレモートレポジトリにpushする

再度クライアントに戻り、

```
work $ git remote add origin ssh://git@server_hostname:/home/git/work/work.git
```
上記により、`git`というユーザーで指定されたサーバーのベアレポジトリにpushせよ！という指示します。

```
work $ git remote -v
origin	ssh://git@server_hostname:/home/git/work/work.git (fetch)
origin	ssh://git@server_hostname:/home/git/work/work.git (push)
```
こんな感じになっていればOKです。もし間違えていたら、`git remote rm origin`で削除してもう一回やりましょう

あとはpushするのみ！

```
work $ git push origin master
```

サーバー側で、`git log`をしてみましょう。現在のコミットが表示されているはずです。

ここで、**いやいやpushしたファイルはサーバー上のどこにあんの！？**となりました。
確かにwork.gitをlsしても

```
work.git> $ ls
HEAD         branches     config       description  hooks        info         objects      refs
```

こんなのしかない。

実際にpushされたファイルは、
XXX.gitではないディレクトリで

```
 git clone work.git
```
を行うことで見れます。

とりあえずこんな感じです。
上記のcloneレポジトリはこのままだと毎回 `git pull`を行わないと各ローカルPCからのpushが反映されないため、下記設定を行う必要があります。
[git pullを自動で行う](https://qiita.com/mkzyk/items/f6fb42bfee757d8245de)

###Pushエラーがでた場合
基本的に、上記`git add .` 、 `git commit`の流れはサーバー側にソースがないことを前提にしている気がする。
もしサーバー上で何かしら変更があった場合、自身で適当に作った`a.txt`のpushが失敗します。
なのでとりあえず通信確認を行いたい場合は

```
git pull origin master
```
を`git remote`で登録した後に行えばよいです。

###GitHub Desktopと連携する
**追記**
ここまでのセットアップが完了し、個人のPCからサーバーにgitコマンドが不自由なくできている場合。
GitHub Desktopでも連携が可能でした。
*少々画像を修正していますのでご了承ください

1. 左上のrepository選択画面で、Addをクリックし"Add Existing Repository"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/368e85ba-b2f6-6c2a-e00e-f0c4883abdec.png)

2. 下記画面に遷移するので、ローカルに作成した作業レポジトリpathをポイントします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/db95e8c7-6ec1-8067-6e70-48eb88a915b6.png)

3. 基本これだけです。一応確認のためにAddしたレポジトリを選択している状態で、Repository -> Repository Settingsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/fa8a9e2b-0c84-c25d-8c5a-b063bcf332f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/6d4478f2-b0bc-1cf1-f0be-2be9dab6d349.png)
上記のようになっていれば普通に作業ができるはずです。