作業ディレクトリに応じてGitで除外する(gitignoreする)ファイルの指定を切り替える
作業ディレクトリ毎にGitで除外する(gitignoreする)ファイルを切り替えたかったのですが、
結論から言うと「Conditional includes」を使うと実現することが出来ました。
Git の設定をリポジトリごとに自動で使い分ける | Articles | Riotz.works
git-config - CONFIGURATION FILE - Conditional includes | git-scm.com
このエントリで扱うのは、次のようなディレクトリ構成では無く
- repository_1
- repository_2
次のようなディレクトリ構成で、work_dir_1/work_dir_2で切り替えたいケースです。
- work_dir_1
- repository_1
- repository_2
- work_dir2
- repository_3
- repository_4
背景
まず、この切り替えをやりたいと思った背景です。
IntelliJ IDEAをプロジェクト標準のIDEとして利用しているケースでは、
「.idea」をリポジトリに含めることが一般的ですが。
特に利用するIDEを定めていない場合は、「.idea」をリポジトリに含めないですし、
「.gitignore」にわざわざ「.idea」を書いたりもしません。
この時は、自身の作業PCに「.idea」を除外する指定を入れるとよいのですが、
IDEAを利用する/しないプロジェクトが混在していると厄介です。
リポジトリ単位で指定するのは面倒で、設定漏れも発生しやすいです。
設定方法
まず、動作確認用に、
以下のコマンドでディレクトリ構成とリポジトリを用意します。
mkdir -p ~/work_dir_1/repository_1/.idea
mkdir -p ~/work_dir_1/repository_2/.idea
mkdir -p ~/work_dir_2/repository_3/.idea
mkdir -p ~/work_dir_2/repository_4/.idea
cd ~/work_dir_1/repository_1 && git init && touch .idea/.gitkeep
cd ~/work_dir_1/repository_2 && git init && touch .idea/.gitkeep
cd ~/work_dir_2/repository_3 && git init && touch .idea/.gitkeep
cd ~/work_dir_2/repository_4 && git init && touch .idea/.gitkeep
repository_1, repository_3で、git statusすると、
.ideaがgitの管理対象になっていることを確認できます。
$ cd ~/work_dir_1/repository_1 && git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.idea/
nothing added to commit but untracked files present (use "git add" to track)
$ cd ~/work_dir_2/repository_3 && git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.idea/
nothing added to commit but untracked files present (use "git add" to track)
それでは、excludesfileを作って、
「Conditional includes」を設定します。
.ideaの除外を指定するために、
~/.config/git/ignore-dotideaを次のような内容で作成します。
.idea
「Conditional includes」でincludeする設定ファイルとして、
~/.gitconfig-work_dir_2を次のような内容で作成します。
[core]
excludesfile = ~/.config/git/ignore-dotidea
~/.gitconfig を次のように編集します。
[includeIf "gitdir:~/work_dir_2/**"]
path = ~/.gitconfig-work_dir_2
repository_1, repository_3,4で、git statusすると、
repository_3,4では、.ideaがgitの管理対象外になっていることを確認できます。
$ cd ~/work_dir_1/repository_1 && git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.idea/
nothing added to commit but untracked files present (use "git add" to track)
$ cd ~/work_dir_2/repository_3 && git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
$ cd ~/work_dir_2/repository_4 && git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
以上で、作業ディレクトリ毎の除外ファイル切り替えが出来ました。
「Conditional includes」使えば、
除外ファイル以外に、Gitのユーザ名・メールアドレスなども切り替えできますね。
gitconfigで設定出来る項目は、以下を参照ください。
git-config - CONFIGURATION FILE | git-scm.com
参考
リポジトリ単位の指定でよい場合
リポジトリ単位の指定で良い場合は、
以下のようにgit config --localでの指定で十分です。
$ cd ~/work_dir_1/repository_2
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.idea/
nothing added to commit but untracked files present (use "git add" to track)
$ git config --local core.excludesfile ~/.config/git/ignore-dotidea
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
ユーザ名・メールアドレスなどの変更のみでよい場合
ユーザ名・メールアドレスなど環境変数によって変更できる項目の場合は、
次のブログで紹介されている方法でも実現できます。
direnvと環境変数を使ってGitのユーザ名、メールアドレス、SSH KEYをリポジトリ毎に切り替える | ゲンゾウ用ポストイット
環境変数で指定できる項目は、次を参照ください。
10.8 Gitの内側 - 環境変数 | git-scm.com
以上。
Discussion