EY-Office ブログ

git update-index --skip-worktree 知ってますか?

今朝へんな夢を見ました。深夜に石作の古い建物の中で、必死に古いGitリポジトリーのメンテナンスを行っていました。😅

日々の開発でGitは空気のように使っていますが、Gitは長年使っている開発者でも数年に1つ、新しいコマンドに出会えます。

Git

Gitの特徴

バージョン管理システムとしては、Git以前にもSubversion(SVN)CVSRCSなどありました(全て使った事があります😅)。一番の特徴は分散管理(分散リポジトリー)だと思います、これについてはWikipediaやネットの情報を参照して下さい。

もう1つの特徴は、たくさんの機能がある事だと思います。SVNやCVSはシンプルで一端コミットしてしまったものは変更できませんが、Gitはコミットログの変更や複数のコミットをまとめたりなど、希にしか使わないですが、プログラマーにとって便利な機能が多数あります。それらが健全なリポジトリーをメンテできる要因だと思います。

ただし、コマンドがたくさんあり過ぎて初心者には優しくないかもしれません。初心者だけではなく長年使っている開発者でも、数年に1つ新しいコマンドを知ります😊。

メンテしている環境で不便なこと

ここ数年あるシステムのメンテナンス的開発を行っているのですが、EC2上の開発環境(開発サーバー)のコードを手元のMacで動くVScodeRemote - SSH extensionを使って開発しています。当然EC2上の開発環境もGitで管理されています。

コードを修正したらgit addgit commitgit 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って本当に良いですね。😊

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ