既存のディレクトリをmasterブランチ以外のブランチに反映する(同期する)手順(覚え書き)。
Gitのホスティングサービスは、GitLabを用いていますが、他を使用した場合も考え方は使えるかと。
やりたいこと
環境
- 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」をクリックしましょう。
(2) 今回は、「Create blank project」(空のプロジェクト)にしました。
(3) 「Project name」にGit管理を始めたいディレクトリと同じ名前をつけ(①)、他は任意に入力し、「Create project」をクリック(②)。
(4) どうやら全く空だとブランチを作れない様子だったので、とりあえず.gitignore(Git管理の対象外とするファイルやディレクトリを記入する)を作っておくことに。
「New file」をクリック。
あるいは、プロジェクト説明の内容が決まっているなら、README(README.md)を追加してしまってもよいかもです。
(7) .gitignoreが作成されたら、ひとまず空のままコミットしてしまいます。
「Commit」をクリック。
(8) 別の「Commit」ボタンが出現するので、こちらもクリック。
(9) プロジェクトアイコンをクリックして、プロジェクトTOPに戻ります。
(10) すると、新しいブランチが作成できるようになっています。
「+」をクリックして(①)出現したプルダウンから、「New branch」をクリック(②)。
(11) 「Branch name」に「develop」と入力して(①)、「Create branch」をクリック(②)。
2. ローカルリポジトリの作成
続いて、ローカル環境で作業を行います。
(1)Git管理を始めたいディレクトリのある階層まで移動したら、対象のディレクトリをひとまずリネームしましょう(理由はページ下部の補足事項に記載しています)。
$ mv test test.origin
(2) 作成したリモートリポジトリのTOP画面で、「clone」をクリックし(①)、「Clone with HTTPS」右横の「Copy」ボタンをクリック。
(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に以下のように記述し、保存します。
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ブランチは以下の通り、ローカルリポジトリの反映されていました。
(2) masterブランチは元の通りで、ローカルリポジトリの内容は反映されていません。
うまくいきました!
補足事項
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と同期したいところですが、開発環境を使ってスタートするケースなど、そうもいかない場合もあったりするもの。
手順に少し癖がありますが、実現できる方法を見つけられてよかったです。