[Git]既存のディレクトリのGit管理をmaster以外のブランチで始める

既存のディレクトリをmasterブランチ以外のブランチに反映する（同期する）手順（覚え書き）。
Gitのホスティングサービスは、GitLabを用いていますが、他を使用した場合も考え方は使えるかと。

## やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0e256968-06df-1a6b-d51c-f320aed244d3.png)


## 環境
* OS: Amazon Linux2
* Gitのホスティングサービス：GitLab

## ディレクトリ構成
```
test
 |
 |----test.php
 |
 |----log →ログ出力用のディレクトリ：配下のファイルはGit管理対象外
 |      |----aaa.log
 |      |----bbb.log
 |      |----ccc.log
 |            :
 |            :
 | 
 |---dao                 
       |----testDao.php                   
```
testディレクトリのGit管理をmasterブランチではなく、developブランチで始めます。
また、logディレクトリ自体はGit管理の対象とするが、配下のログファイルは管理対象外とします。

## 手順
### 1. リモートリポジトリの作成
(1) まずGit管理を始めたいディレクトリと同名のプロジェクトを作成します。
GitLabにログインしたら、「New project」をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/13b72914-6ed3-cb64-fe68-7221e027c5ed.png)

(2) 今回は、「Create blank project」（空のプロジェクト）にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/d592aa00-4ac9-4750-bfa5-77546ed57d9c.png)

(3) 「Project name」にGit管理を始めたいディレクトリと同じ名前をつけ（①）、他は任意に入力し、「Create project」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/bafe88ca-dd57-01fc-4689-7f7762591edf.png)

(4) どうやら全く空だとブランチを作れない様子だったので、とりあえず.gitignore（Git管理の対象外とするファイルやディレクトリを記入する）を作っておくことに。
「New file」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/77c7d451-24ab-c516-a8e8-50e79a7a17bf.png)
あるいは、プロジェクト説明の内容が決まっているなら、README（README.md)を追加してしまってもよいかもです。

(5) 遷移先の画面にて、「New file」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ed705def-023f-5be2-ff47-4435a332c623.png)

(6) 「.gitignore」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/8889680f-81f5-6415-407a-47234d468495.png)

(7) .gitignoreが作成されたら、ひとまず空のままコミットしてしまいます。
「Commit」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f38a378e-9500-5a2f-0afd-72c35304111b.png)

(8) 別の「Commit」ボタンが出現するので、こちらもクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/405d8580-2e63-deb8-a324-8a80039c9316.png)

(9) プロジェクトアイコンをクリックして、プロジェクトTOPに戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/cf22892b-d85b-ff0d-c5db-16a515fc6ee2.png)

(10) すると、新しいブランチが作成できるようになっています。
「＋」をクリックして（①）出現したプルダウンから、「New branch」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/3fb669f5-90af-f42c-a7fc-123b8c33cd09.png)

(11) 「Branch name」に「develop」と入力して（①）、「Create branch」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/1c75aae7-111d-848f-c89b-5c317e3a264a.png)

### 2. ローカルリポジトリの作成
続いて、ローカル環境で作業を行います。

(1)Git管理を始めたいディレクトリのある階層まで移動したら、対象のディレクトリをひとまずリネームしましょう（理由はページ下部の補足事項に記載しています）。

```
$ mv test test.origin
```

(2) 作成したリモートリポジトリのTOP画面で、「clone」をクリックし（①）、「Clone with HTTPS」右横の「Copy」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/be9da81f-bbd2-4c26-979c-3967ddecd797.png)

(3) 以下のコマンドを実行して、developブランチとしてcloneします。

```
$ git clone -b develop [(2)でコピーしたURL] ([ディレクトリ名])
```
もし、プロジェクト名と異なる名称で、クローンしたい場合は、「[(2)でコピーしたURL]」から半角スペースを空けて、つけたい名称を入力しましょう（「([ディレクトリ名])」の部分）。

(4) リネームしたディレクトリ配下をcloneしたリポジトリにコピーします。

```
$ cp -Rp test.origin/* test/
```

(5) その後、リポジトリ配下に移動し、以下のコマンドを実行して、

* 成果物がコピーできていること
* cloneできていること（.git, リモートリポジトリで作成した.gitignoreが存在するか）

を確認します。

```
$ tree -a
```

(6) 不要なファイルがあれば先に削除しておきましょう。
以下のコマンドを実行すれば、対象のディレクトリ配下がサブディレクトリ含め、フルパスで表示されるので、除外したいファイル（ディレクトリ）の先頭に「rm (-r )」をつけてあげればスムーズです。

```
$ ls -d $(find [ディレクトリへのパス])
```

(7) logディレクトリのみGit管理の対象とし、配下のファイルは対象外とする対処を施します。
まず、logディレクトリ配下で、.gitkeepを作成しましょう（隠しファイルであれば名前は問いません）。

```
$ cd log
$ touch .gitkeep
```

(8) 1階層上に戻って、.gitignoreに以下のように記述し、保存します。

```:.gitignore
log/*
!log/.gitkeep
```
これで、.gitkeepを除くlogディレクトリ配下のファイルが全てGit管理対象外となり、.gitkeepによってlogディレクトリはGit管理の対象とされます。
※「log/*」を「log/」とすると、ディレクトリごと無視され、「!log/.gitkeep」と書いても対象にならないので注意！


(9) 再度treeコマンドを実行して、ディレクトリの構造を確認しておくと安心です。

```
$ tree -a
```

(10) ステージングに追加し、コミット、プッシュします。
ここで、サーバ上のdevelopは本来デプロイ用のもののため（場合にもよると思いますが）、gitconfigにユーザー情報を保存せず、一時的な情報でコミットします。
コミットメッセージは任意で。

```
-- コミット対象をステージングについか
$ git add .
-- コミット対象を確認（手順9のtreeコマンドの実行結果と照合するとよい）
$ git status
-- コミット
$ git -c user.name='hoge' -c user.email='hoge@test.com' commit -m 'first commit'
-- リモートリポジトリに反映
$ git push
```

### 3. リモートリポジトリへの反映確認

ローカルリポジトリの内容がリモートリポジトリのdevelopブランチに反映されているか確認します。

(1) developブランチは以下の通り、ローカルリポジトリの反映されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/aa469235-104c-ffc0-9890-f009071ec9eb.png)

(2) masterブランチは元の通りで、ローカルリポジトリの内容は反映されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/c29d3a2d-eaee-ceed-0c6b-a783e585ea81.png)


うまくいきました！

## 補足事項
Git管理したいディレクトリをリネームしている理由は以下の通り。

#### 1. リネームせず、同階層でcloneしようとした場合

```
$ sudo git clone -b [GitLabよりコピーしたURL]
fatal: destination path 'test' already exists and is not an empty directory.
```

#### 2. リネームせず、ディレクトリ直下でcloneしようとした場合

```
$ sudo git clone -b [GitLabよりコピーしたURL] .
fatal: destination path '.' already exists and is not an empty directory.
```

どちらの場合でもエラーになってしまうんですね。。
そのため、既存のディレクトリを一度リネームして、リモートリポジトリをクローンしてから、中身をコピーするという流れに落ち着きました。

## 終わりに
既存のディレクトリをGit管理する場合、リモートリポジトリのmasterと同期したいところですが、開発環境を使ってスタートするケースなど、そうもいかない場合もあったりするもの。
手順に少し癖がありますが、実現できる方法を見つけられてよかったです。

## 参考
* [【 cp 】コマンド――ファイルをコピーする | atmarkIT](https://www.atmarkit.co.jp/ait/articles/1605/31/news019.html)
* [リモートから特定のブランチを指定してcloneする | Qiita](https://qiita.com/icoxfog417/items/5776e0f0f758f0f0e48a)
* [gti cloneでリポジトリの中身だけ取ってくる | Qiita](https://qiita.com/petra301010/items/db3c6d4d2a94c36e3d10)
* [2.1 Git の基本 - Git リポジトリの取得 | Git](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97)
* [ls -lコマンドの結果をサブディレクトリ含めてフルパスで列挙したい | Qiita](https://qiita.com/dwatarub/items/768c5eb263b49198952e)
* [名前やメールアドレスを一時的に指定して git commit する方法 | Qiita](https://qiita.com/megane42/items/5375b54ea3570506e296)
* [.gitignore の書き方 | Qiita](https://qiita.com/C_HERO/items/970c1abde1cdbb81f243)
* [GitLabの使い方～発展編～ | tracpath](https://tracpath.com/works/development/learn-gitlab-tutorial-for-beginners2/)