今朝へんな夢を見ました。深夜に石作の古い建物の中で、必死に古いGitリポジトリーのメンテナンスを行っていました。😅
日々の開発でGitは空気のように使っていますが、Gitは長年使っている開発者でも数年に1つ、新しいコマンドに出会えます。
Gitの特徴
バージョン管理システムとしては、Git以前にもSubversion(SVN)やCVS、RCSなどありました(全て使った事があります😅)。一番の特徴は分散管理(分散リポジトリー)だと思います、これについてはWikipediaやネットの情報を参照して下さい。
もう1つの特徴は、たくさんの機能がある事だと思います。SVNやCVSはシンプルで一端コミットしてしまったものは変更できませんが、Gitはコミットログの変更や複数のコミットをまとめたりなど、希にしか使わないですが、プログラマーにとって便利な機能が多数あります。それらが健全なリポジトリーをメンテできる要因だと思います。
ただし、コマンドがたくさんあり過ぎて初心者には優しくないかもしれません。初心者だけではなく長年使っている開発者でも、数年に1つ新しいコマンドを知ります😊。
メンテしている環境で不便なこと
ここ数年あるシステムのメンテナンス的開発を行っているのですが、EC2上の開発環境(開発サーバー)のコードを手元のMacで動くVScodeのRemote - SSH extensionを使って開発しています。当然EC2上の開発環境もGitで管理されています。
コードを修正したらgit add
→ git commit
→ git push
して開発を進めているのですが、実は開発環境で動かすためにいくつかのファイルを修正しています。たとえばGitにpushされているコードはproduction用の設定になっているので、development環境になるよう一部ファイルを変更しています、それ以外にもいくつか変更点がありました。
最近は.env
ファイルに環境依存の項目を書いて置き、.env
はgitに入れないなどの手法が確立していますが、この古いプロジェクトでは完全ではなく、どうしても一部ファイルの変更が必要になります。
したがって、開発環境でうっかりgit add .
やgit commit -a
などを行ってコミットしてしまうと変更してはいけないファイルまでコミットしてしまいます。たいして難しいことではないですが、やはり毎回気をつかってコミットするのは疲れます。
git管理しているファイルを無視する
Gitには.gitignoreファイルに指定したファイルやディレクトリをGitの管理下に入れないという機能があります。
ただし、.gitignore
はすでにGitの管理下に入っているファイルの変更を無視する事はできません。また通常.gitignore
ファイルもGit管理されているので、自分の開発環境に依存したファイルを.gitignore
に入れるのも気が引けます。😅
そこで「git管理しているファイルを無視する」で検索したところ、git update-index --skip-worktree
コマンドの記事が出てきました。
このコマンドで指定したファイルは、作業ツリー内の変更されたファイルを変更しなかった事にします。ファイル内容は変更してあるのにgit status
の表示には含まれませんし、コミットもされません。これは便利です !!
git update-indexコマンドの詳細は、ここにあります が、今回の目的では
- 無視するファイルの設定
$ git update-index --skip-worktree ファイル名
- 無視するファイルの取り消し
$ git update-index --no-skip-worktree ファイル名
- 現在、無視されているファイル一覧の表示
$ git ls-files -v | grep ^S
です。
また似た機能としてgit update-index --assume-unchanged
もありますが、微妙に違います。詳しくはネットで調べてください。
また.gitignore
ファイルに追加せず、ファイルをGit管理外にするには.git/info/exclude
ファイルに書くことで実現できます。
まとめ
これで、快適に開発できるようになりました! Gitって本当に良いですね。😊