作業ディレクトリに応じてGitで除外する(gitignoreする)ファイルの指定を切り替える
作業ディレクトリ毎にGitで除外する(gitignoreする)ファイルを切り替えたかったのですが、
結論から言うと「Conditional includes」を使うと実現することが出来ました。
Git の設定をリポジトリごとに自動で使い分ける | Articles | Riotz.works
https://riotz.works/articles/lulzneko/2019/06/08/automatically-swich-git-configuration-for-each-repository/
git-config - CONFIGURATION FILE - Conditional includes | git-scm.com
https://git-scm.com/docs/git-config#_conditional_includes
このエントリで扱うのは、次のようなディレクトリ構成では無く
- 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
https://git-scm.com/docs/git-config#_configuration_file
参考
リポジトリ単位の指定でよい場合
リポジトリ単位の指定で良い場合は、
以下のように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をリポジトリ毎に切り替える | ゲンゾウ用ポストイット
https://genzouw.com/entry/2021/08/04/153026/2750/
環境変数で指定できる項目は、次を参照ください。
10.8 Gitの内側 - 環境変数 | git-scm.com
https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0
以上。