Gitのバージョンが2.3より古いレンタルサーバーにGitでデプロイする

今回はレンタルサーバーで提供されいているGitのバージョンが、
2.3より古い場合の、Gitでデプロイする方法をまとめたいと思います。

自社の環境では、レンタルサーバー上にGit環境を構築して、
bitbucketなどのホスティングサービス上のブランチが更新されたら、
更新内容をpushして、レンタルサーバー上にデプロイしてたりします。

ですが、レンタルサーバー上にインストールされいてるGitのバージョンが2.3より古い場合、
`git config receive.denyCurrentBranch updateInstead`の設定が行えないため、
一度レンタルサーバー上のベアリポジトリ経由して、レンタルサーバー上に反映させる必要があります。

ベアリポジトリとノンベアリポジトリの違い、`git config receive.denyCurrentBranch updateInstead`の設定の詳細は、以下の素晴らし記事がとても参考になりました。

[ベアリポジトリとノンベアリポジトリ：理論編〜GitでWordpressのテーマを管理](https://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git)
[Gitがv2.3.0になって、Push to Deployがしやすくなって便利](https://qiita.com/takoba/items/8026127469e7359cba2e)

ここ半年くらいで、デプロイ環境を構築した際に、
以下のサーバーは、Gitのバージョンが2.3より古かったです。

* ヘテムル
* ロリポップ
* エックスサーバー

<h2>構築手順</h2>

<h3>手順内での各種情報</h3>

* レンタルサーバーのホスト名　：　<b>rental-server</b>
* レンタルサーバーのログインアカウント　： <b>rental</b>
* レンタルサーバーのSSHポート　： <b>22</b>
* 任意のディレクトリ　：　<b>/home/rental/</b>
* ベアリポジトリ用のディレクトリ名　：　<b>
bare-dir</b>
* ノンベアリポジトリ用のディレクトリ名 ： <b>non-bare-dir</b>
* ノンベアリポジトリに反映させたいブランチ　：　<b>master</b>
* デプロイ方法　： <b>bitbucketのpipeline機能</b>

<h3>レンタルサーバー側手順</h3>

* レンタルサーバーにSSHでログイン

```shell
ssh rental@rental-server -p22 #ssh アカウント名@サーバー名 -pポート番号
```

* ログイン後、任意のディレクトリに移動し、ベアリポジトリ用のディレクトリと、ノンベアリポジトリ用のディレクトリを作成

```shell

cd /home/rental/ #任意のディレクトリに移動
mkdir bare-dir #ベアリポジトリ用のディレクトリを作成
mkdir non-bare-dir #ノンベアリポジトリ用のディレクトリを作成
```

* ベアリポジトリの初期化

```shell

cd /home/rental/bare-dir/ #ベアリポジトリ用のディレクトリに移動
git "init --bare --shared" ##ベアリポジトリの初期化
```

* post-updateの作成

post-updateはベアリポジトリにプッシュが行われた場合の動作を記述出来るファイルです。

```shell

cd /home/rental/bare-dir/hooks/ #post-updateの格納先に移動
cp -p post-update.sample post-update　#post-updateのサンプルから複製
```
* post-updateの編集

```shell:post-update
#!/bin/sh

branch=$(git rev-parse --symbolic --abbrev-ref $1)

if [ "$branch" = "master" ] #ベアリポジトリにmasterブランチがプッシュされた場合の動作
then
        cd /home/rental/non-bare-dir/ #ノンベアリポジトリ用のディレクトリに移動
        git --git-dir=.git pull /home/rental/bare-dir/ master #ベアリポジトリからmasterブランチをpull
fi
```
post-updateの他に、同じhooksディテクトリにあるpost-receiveファイルでもプッシュ時の動作を記述することが出来ます。
が、post-updateの方が、pushされた際のブランチ毎に動作を分けて記述出来ます。
※デモサイトと本番サイトの公開ディレクトリがレンタルサーバー内に存在した場合、developブランチはデモサイト用の公開ディレクトリに反映させて、masterブランチは本番公開用のディレクトリに反映させたり出来ます。

* ベアリポジトリをノンベアリポジトリにclone

```shell

cd /home/rental/non-bare-dir/ #ノンベアリポジトリ用のディレクトリに移動
git clone /home/rental/bare-dir/ #ベアリポジトリ用からクローン
mv ./bare-dir/* ./ #ベアリポジトリのファイルを移動
rm -fr ./bare-dir　#クローンしてきたベアリポジトリ用のディレクトリを削除
```
これでレンタルサーバー側の設定は終わりになります。

<h2>bitbucketからのデプロイ</h2>

bitbucketのpipeline機能を使って、該当のリポジトリにプッシュするには、
以下の記事が参考になるかと思います。

[bitbucketのPipelinesを試してみる](https://qiita.com/yshishido/items/b3a57ffeae708841980d)

記事内にある`bitbucket-pipelines.yml`と、各種変数設定を今回用に書き換えた場合、
以下のようになります。

```php:bitbucket-pipelines.yml
pipelines:
  branches:
    master:
      - step:
          deployment: production
          script:
            - git remote add prod ssh://$PROD_SSH_USER@$PROD_SSH_SERVER:$PROD_SSH_PORT/$PROD_SOURCE_DIR
            - git fetch
            - git push prod master
```

![pipeline.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140849/2b8d6403-c19a-a5cb-17b7-0e3c6e18cb94.jpeg "各種変数設定")

<h2>まとめ</h2>

レンタルサーバーによって、Gitのバージョンに違いがありますが、
プランの記述などを見ても、バージョンについての記述はほとんど書かれていないため、
構築時の参考になれば幸いです。

他にもレンタルサーバーの契約によっては、SSHが使えない場合などもありますので、
その場合の対応なんかも、別の機会にまとめてみたいと思います。