【Rails】Git管理せずにRails newしたい

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管理する仕組みになっています。

Git - Git リポジトリの取得

Git - git-init Documentation

G オプションを付与することでGitに関するディレクトリとファイルの自動生成を行わずrails new することができます。

コマンドラインツール - Railsガイド

どんな時に使うのか?

下記のように既に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_1child_app_2 の2つのアプリを一括でGit管理する際に支障をきたしてしまいます(具体的な支障については未検証です...)。

child_app_1child_app_2rails 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管理されない)。

Git - Git リポジトリの取得

Git - 変更内容のリポジトリへの記録

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 コマンドはファイル削除コマンドですが下記オプションを追加することでディレクトリの削除を行います。

  • r オプション: ディレクトリを削除する際に必要なオプション
  • f オプション: ディレクトリ削除時の確認メッセージをスキップして強制実行

感想

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アプリに限定したほうが良さそうです。

参照

Git - Git リポジトリの取得

Git - git-init Documentation

コマンドラインツール - Railsガイド

Git - Git リポジトリの取得

Git - 変更内容のリポジトリへの記録

Git - Git の属性