Git管理せずにrails new
したかったので方法を調べました。
結論
rails new
時にG
(--skip-git
)オプションを付与する。
$ rails new アプリ名 -G $ rails new アプリ名 --skip-git # -Gと同じ
rails new
時はデフォルトでGit管理が自動で行われる仕様になっています(git init
が行われる)。
Gitはgit init
コマンドでGit管理したいディレクトリ内に.git
ディレクトリを作成することでGit管理する仕組みになっています。
G
オプションを付与することでGitに関するディレクトリとファイルの自動生成を行わずrails new
することができます。
どんな時に使うのか?
下記のように既にGit管理しているディレクトリ内でrails new
したい場合に使用する。
. └ parent_directory/ # Git管理されている親ディレクトリ ├ .git/ # Git管理用ディレクトリ ├ child_app_1/ └ child_app_2/
実務で1つのGitリポジトリ内で複数のアプリをGit管理することは殆ど無さそうですが、技術書を使った学習の際には1つのリポジトリ内で複数のアプリを作成することは良くありそうです。
上記のディレクトリ構造でG
オプション無しで子アプリをrails new
すると下記のようにアプリ毎に.git
ディレクトリが作成され、「Git管理の中でGit管理する」という状態になってしまいます。
. └ parent_directory/ ├ .git/ # parent_directory内のGit管理用ディレクトリ ├ child_app_1/ │ └ .git/ # child_app_1のGit管理用ディレクトリ └ child_app_2/ └ .git/ # child_app_2のGit管理用ディレクトリ
こうなるとparent_directory
ディレクトリでchild_app_1
とchild_app_2
の2つのアプリを一括でGit管理する際に支障をきたしてしまいます(具体的な支障については未検証です...)。
child_app_1
とchild_app_2
のrails new
時にG
オプションを付与することでparent_directory
ディレクトリから2つのアプリを一括でGit管理することができます。
# アプリ毎にGit管理を行わずに2つのアプリを作成 $ cd parent_directory $ rails new child_app_1 -G $ rails new child_app_2 -G
# 上記コマンドで作成した場合のディレクトリ構造 . └ parent_directory/ ├ .git/ # child_app_1、child_app_2のGit管理用ディレクトリ ├ child_app_1/ └ child_app_2/
Gオプションを付与すると何が変わるのか?
次のディレクトリとファイルが自動生成されなくなります。
.git
ディレクトリ: Git管理用ディレクトリ.gitignore
ファイル: Git管理から除外する対象を指定するファイル.gitattributes
ファイル: パス固有の設定(Gitの属性)を指定するファイル
.git
ディレクトリが自動生成されなくなることによって結果的にGit管理されなくなります。
.gitignore
と.gitattributes
はGit管理をする/しないには直接関係無さそうです(存在していてもGit管理されない)。
下記はrails new
時にG
オプションを付与したアプリと付与しなかったアプリの生成されるファイルとディレクトリの差分です。
no_skip_git_app
アプリはG
オプション無し(デフォルト)で作成したアプリ、skip_git_app
アプリはG
オプション有りです。
# Gオプション無しで作成したアプリ $ cd ~/parent_directory/no_skip_git_app/ $ ls -la drwxr-xr-x 13 karlley staff 416 5 20 09:15 .git # 自動生成される -rw-r--r--@ 1 karlley staff 246 5 20 07:30 .gitattributes # 自動生成される -rw-r--r-- 1 karlley staff 778 5 20 07:30 .gitignore # 自動生成される -rw-r--r-- 1 karlley staff 6 5 20 07:30 .ruby-version -rw-r--r-- 1 karlley staff 2270 5 20 07:30 Gemfile -rw-r--r-- 1 karlley staff 5534 5 20 07:31 Gemfile.lock -rw-r--r-- 1 karlley staff 374 5 20 07:30 README.md -rw-r--r-- 1 karlley staff 227 5 20 07:30 Rakefile drwxr-xr-x 11 karlley staff 352 5 20 07:31 app drwxr-xr-x 7 karlley staff 224 5 20 07:31 bin drwxr-xr-x 16 karlley staff 512 5 20 07:31 config -rw-r--r-- 1 karlley staff 160 5 20 07:30 config.ru drwxr-xr-x 3 karlley staff 96 5 20 07:30 db drwxr-xr-x 4 karlley staff 128 5 20 07:30 lib drwxr-xr-x 4 karlley staff 128 5 20 07:31 log drwxr-xr-x 9 karlley staff 288 5 20 07:30 public drwxr-xr-x 3 karlley staff 96 5 20 07:30 storage drwxr-xr-x 12 karlley staff 384 5 20 07:30 test drwxr-xr-x 7 karlley staff 224 5 20 07:31 tmp drwxr-xr-x 4 karlley staff 128 5 20 07:31 vendor # Gオプション有りで作成したアプリ $ cd ~/parent_directory/skip_git_app/ $ ls -la # Git関連のファイルとディレクトリが生成されていない -rw-r--r-- 1 karlley staff 6B 5 20 07:32 .ruby-version -rw-r--r-- 1 karlley staff 2.2K 5 20 07:32 Gemfile -rw-r--r-- 1 karlley staff 5.4K 5 20 07:32 Gemfile.lock -rw-r--r-- 1 karlley staff 374B 5 20 07:32 README.md -rw-r--r-- 1 karlley staff 227B 5 20 07:32 Rakefile drwxr-xr-x 11 karlley staff 352B 5 20 07:32 app drwxr-xr-x 7 karlley staff 224B 5 20 07:32 bin drwxr-xr-x 16 karlley staff 512B 5 20 07:32 config -rw-r--r-- 1 karlley staff 160B 5 20 07:32 config.ru drwxr-xr-x 3 karlley staff 96B 5 20 07:32 db drwxr-xr-x 4 karlley staff 128B 5 20 07:32 lib drwxr-xr-x 4 karlley staff 128B 5 20 07:32 log drwxr-xr-x 9 karlley staff 288B 5 20 07:32 public drwxr-xr-x 3 karlley staff 96B 5 20 07:32 storage drwxr-xr-x 12 karlley staff 384B 5 20 07:32 test drwxr-xr-x 7 karlley staff 224B 5 20 07:32 tmp drwxr-xr-x 4 karlley staff 128B 5 20 07:32 vendor
rails new時にGオプションを付け忘れてしまった場合は?
Git管理されているディレクトリ内でG
オプションを付け忘れてrails new
してしまった場合でも.git
ディレクトリを削除することで作成したアプリのGit管理を止めることが可能です。
# Git管理を停止したいアプリへ移動 $ cd アプリのディレクトリ # Git管理の停止のみの場合 $ rm -rf .git # Git管理を停止、Git関連のファイルも削除する場合 $ rm -rf .git .gitattributes .gitignore
rm
コマンドはファイル削除コマンドですが下記オプションを追加することでディレクトリの削除を行います。
感想
Gitの復習になって良かった! 独習Railsはnewする機会が多いのでこれでガンガンnewできそう。 いつも学びの機会を与えてくれる輪読会と参加者の方に感謝です。
追記: Gオプションを付ける付ける注意点
G
オプション付きで作成したRailsアプリ内にGitHubにアップロードするべきではないファイルが無いか確認してください!!
具体的にはトークンやAPIキーが含まれるファイルが該当します。
本来G
オプション付きで作成したRailsアプリはGit管理されることを想定されていないので.gitignore
も作成されません。
今回の例のようなG
オプション付きで作成したRailsアプリを親ディレクトリでGit管理する場合、Railsが用意してくれる.gitignore
でアップロードするべきでないファイルをGit管理から除外されていません。
その為、
トークンやAPIキーをGitHubにアップロードしてしまう可能性があります!!
この記事の投稿時点で気づいていれば良かったのですが、今頃になって参加している輪読会で指摘していただき気付くことができました汗
この問題の対策としては「G
オプション無しでRailsアプリを作成後、.git
ディレクトリのみ削除する」ことです。
こうすることで.gitignore
が作成したRailsアプリに残るのでGit管理したくないファイルをしつつ、親ディレクトリでGit管理することができます。
G
オプション付きでのrails new
はGit管理しないRailsアプリに限定したほうが良さそうです。