Git 管理中のファイルを .gitignore に追加したあと追跡しないようにする

前回、GitHub にパスワード等の情報を公開しないようにする方法として、production-config.js といったファイルを作って .gitignore に追加しておく、というやり方を紹介した。

これに関連しての Git ネタ。

管理する環境情報が増えてきた

もし、production-config.js で管理する環境情報が増えてきたら、ということを考える。

// production-config.js
module.exports = {
  // FTP 接続先情報
  ftp: {
    user    : 'user',
    password: 'password',
    host    : 'example.com'
  },
  // サーバのログイン情報
  server: {
    // ...
  },
  // メールサーバの設定
  mailServer: {
    // ...
  }
  // ...
};

こうなってくると、設定ファイルにどのような構成で情報を書いていたか、分かりにくくなってくる。別環境で当該プロジェクトを git clone した時に、production-config.js は一切 Git 管理されていないので、このファイルにどんな風に設定情報を書けばいいのか、分かりにくくなるのだ。

一度だけ Git 管理し、以降は無視したい

そこで、設定値を書いていない空の production-config.js を用意し、コレを1回だけコミットしておこうと思う。そうすれば、別環境で git clone した時も、「production-config.js のこの欄にパスワードを書けばいいんだな」と分かる。

ということで以下のようなファイルを用意。

// production-config.js
module.exports = {
  // FTP 接続先情報
  ftp: {
    user    : '',  // ← ココを空文字にした状態で置いておく
    password: '',
    host    : ''
  },
  // ...
};

まずはこの状態のファイルをいつもどおり $ git add production-config.js してコミットしよう。このファイルは秘密情報を含んでいないので Push してしまって問題ない。あわせて、.gitignoreproduction-config.js を間違いなく登録しておく。

その上で、ローカルでこのファイルの変更を監視しないように設定する。

# ローカルの production-config.js の変更を監視しないようにする
$ git update-index --skip-worktree production-config.js

コレで、production-config.js を変更しても git status に表れなくなるので、ウッカリ git add . で追加してしまった、といった事故が防げる。あとはパスワード等の設定項目をローカル環境でだけ書いておけば良い。

この skip-worktree と似たモノに assume-unchanged というコマンドもあり、両者は似たようなことができる。skip-worktree の方がローカルの変更を優先して保持する感じで、assume-unchanged はリモートに変更があったらそれを取り込んでローカルの変更を破棄する動き。