[GitLab]既存のプロジェクトでGit管理を始める

すでに、稼働しているプロジェクト（ディレクトリ）のGit管理を始める手順です。
GitのホスティングサービスとしてGitLabを用いていますが、考え方は、GitHubやCodeCommitなど、他を用いた場合でも使えます。

## 環境
* OS: Amazon Linux2
* GitLab

## 前提条件

* GitLabアカウントは作成済とします。

## ディレクトリ構成
Git管理したいプロジェクトのディレクトリ構成は以下の通り。

```
dog
 |
 |----dog.php → 処理プログラム
 |
 |----temp → 一時ファイル用のディレクトリ：配下のファイルはGit管理対象外
 |      |----aaa.temp
 |      |----bbb.temp 
 |      |----ccc.temp 
 |            :
 |            :
 | 
 |---batch                    
         |----dogBatch.php                   
         |----logs → ログファイル用のディレクトリ：配下のファイルはGit管理対象外
                 |----aaa.log
                 |----bbb.log
                 |----ccc.log
                       :
                       :
```
このうち、

* temp：一時ファイル用のディレクトリのため
* batch/logs：ログファイル用のディレクトリのため

は、Git管理の対象外とします。

## 手順

以下、適宜、sudoを付けて実行してください（Amazon Linux2の場合）。

### 1. Gitのインストールと初期設定

(1) 以下のコマンドを実行し、Gitをインストールしましょう。

```
$ yum install git-all
```

(2) 次に、ユーザー名とメールアドレスを設定します。

```
$ git config --global user.name "hoge"
$ git config --global user.e-mail "hoge@example.com"
```

(3) 設定内容を確認します。以下のように、設定した内容が表示されればOKです。

```
$ git config --list
user.name=hoge
user.email=hoge@example.com
```

### 2. ローカルリポジトリで、Git管理を始める

ここで、ローカルリポジトリとは、今回Git管理を始めるサーバ上のプロジェクト（ディレクトリ）を指しています。
以下の作業は、原則Git管理したいプロジェクト直下（本手順ではdog直下）で行うようにしてください。

(1) まず、treeコマンドを実行してディレクトリ構成を把握しましょう。
この段階で、どのディレクトリもしくはファイルをGit管理の対象とするか決めます。

```
$ tree
.
├── batch
│   ├── dogBatch.php
│   └── logs
│       ├── aaa.log
│       ├── bbb.log
│       └── ccc.log
├── dog.php
└── temp
    ├── aaa.tmp
    ├── bbb.tmp
    └── ccc.tmp
```

(2) リポジトリの初期化をします。

```
$ git init
```

(3) (1) でGit管理しないと決めたディレクトリのうち、ディレクトリそのものは残したいものに対し、配下に隠しファイルを作成しておきます。

```
$ touch temp/.gitkeep
$ touch batch/logs/.gitkeep
```

今回は、「ディレクトリ構成」でも記載の通りのtempディレクトリと、batch/logsディレクトリ配下に隠しファイル.gitkeepを作成しました。
このファイル名はなんでもよいのですが、いい加減な名前をつけると後々問題になりかねないので、.gitkeepのような分かりやすい名前にしておくのがよいでしょう。

(4) .gitignore（= Git管理したくない対象を記載するファイル)を作成します。

```
touch .gitignore
```

(5) .gitignoreをvimで開き、以下を書き込み、保存します。

```:.gitignore
batch/logs/*
!batch/logs/.gitkeep
temp/*
!temp/.gitkeep
```

上記のように記述することで、Git管理したくないディレクトリに対し、ディレクトリを残すための隠しファイルのみGit管理の対象とすることができます（=ディレクトリ自体もGit管理の対象となります）。

詳しくは、
 [.gitignoreの否定文(!)でハマったところ | Qiita](https://qiita.com/NumAniCloud/items/fd452828f634b577ae28)
辺りをご参照ください。

(6) 続いて、以下のコマンドを実行して、Git管理対象をステージングにあげましょう。

```
$ git add .
```
(7) git statusコマンドを実行して、ステージングに上がっているファイル、ディレクトリを確認します。

```
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitignore
        new file:   batch/dogBatch.php
        new file:   batch/logs/.gitkeep
        new file:   dog.php
        new file:   temp/.gitkeep
```
上記のように、.gitignoreで、Git管理対象外としたものが含まれていなければOKです。

(8) 変更をコミットします。

```
$ git commit -m "first commit of dog"
```

## 3. GitLabで、リモートリポジトリを作成する

(1) GitLabにログインし、「New project」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/99e63ff8-2362-4f7a-3cb8-4df924455503.png)

(2) Linuxサーバ上のローカルリポジトリをまるっと反映させるので、「Create blank project」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f41456a4-346e-6fb2-958d-151cf7c28aee.png)


(3) プロジェクト名を入力し（①）、プロジェクトの説明（Project description）や、可視化レベル（Visibility Level）などを適宜変更し、「Create project」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e65bee7c-6ee0-1e45-0c1b-56de82459a9b.png)


(4) プロジェクトが作成されたら、「Clone」をクリックして（①）、その後に表示される「Clone with HTTPS」の「Copy URL」をクリック（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/af446dbc-5499-ee11-8713-0a2ec8eb1867.png)

## 4. ローカルリポジトリとリモートリポジトリの同期

2で作成したローカルリポジトリをリモートリポジトリに反映させます。

(1) ローカルリポジトリにて、以下のコマンドを実行しましょう。

```
$ git remote add origin [3-(4)でコピーしたURL]
```

この後、ユーザー名とパスワードを聞かれるので、GitLabのアカウントのそれらを入力します。

(2) 続いて以下のコマンドを実行し、ローカルリポジトリのmasterブランチをリモートリポジトリのmasterブランチとして反映させます。

```
$ git push -u origin master
```

(3) GitLabのページをリロードし、ローカルリポジトリの内容が反映されていれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ba049d42-e70d-6297-5dab-9aee6c364be0.png)

## 終わりに
ポイントは、何を管理対象から外すか。
余分なファイルをGit管理に含めないようにしましょう。

## 参考

* [1.5 使い始める - Gitのインストール | git](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
* [【 GitHub 】ローカル作成したリポジトリをリモートに「Push」するまで！ | Qiita](https://qiita.com/Futo_Horio/items/4d669f695680bc13d5fa)
* [.gitignore の書き方 | Qiita](https://qiita.com/C_HERO/items/970c1abde1cdbb81f243)