1台のLinuxマシン上でGitを使っていて、基本的に同一のアカウントを使っているのだけれども、リポジトリによっては別のアカウントを使ったり、状況に応じて複数のGitのユーザ情報を切り替えたいケースが発生することがある。
これは例えば会社でとあるプロジェクトの時はこちらのユーザ名を使ってコミットし、別のプロジェクトの時は別のユーザ名を使ってコミットする、というような状況である。
通常であれば、${HOME}/.gitconfig
にユーザ情報を記入している。これはメインで使われているアカウントが入っている場合が多い。
.gitconfig
[user] name = msyksphinz email = msyksphinz_dev.gmail.com
これ以外に、特定のGitリポジトリでは別のアカウントを使いたいとき、そのリポジトリのルートディレクトリの直下の.git/config
に登録する、という手があるらしい。
${Repository}/.git/config
[user] name = sub_msyksphinz email = sub_msyksphinz_dev.gmail.com
この方法は一見よさそうに思えるが、同じリポジトリを複数のディレクトリに展開しているとき(一方は開発用、一方はローカル環境でリグレッションを流している場合など、複数の場所にリポジトリを展開することは良くある)、cloneしたリポジトリに何度も同じ設定をしなければならないので面倒くさい。
いろいろと調べていると、.gitconfig
はinclude文により別のファイルから設定を取り込めることが分かった。
なるほど、ということはGitユーザ名の項目をinclude文で取り入れるようにして、状況によってGitユーザ名を切り替えるコマンドを用意しておけばよいのではないか。
Gitのユーザ名を切り替えるためには、Environmental Modulesを使用した。つまり、以下の2つのファイルを用意した(MODULEPATH
環境変数は${HOME}/modules
に設定されていることを前提とする)。
$ cd ${MODULEPATH} $ tree . . ├── git │ ├── git.local -> /home/msyksphinz/dotfiles/modules/git/git.local │ ├── git.sub-> /home/msyksphinz/dotfiles/modules/git/git.sub │ ├── local -> /home/msyksphinz/dotfiles/modules/git/local │ └── sub-> /home/msyksphinz/dotfiles/modules/git/sub └── riscv ├── riscv32 -> /home/msyksphinz/dotfiles/modules/riscv/riscv32 ├── riscv64 -> /home/msyksphinz/dotfiles/modules/riscv/riscv64 ├── riscv64-bare ...
git/local
とgit/sub
が用意されており、それぞれユーザ名の情報を格納したgit.local
とgit.sub
というファイルを作った。
git.local
[user] name = msyksphinz email = msyksphinz_dev.gmail.com
git.sub
[user] name = sub_msyksphinz email = sub_msyksphinz_dev.gmail.com
以下のModulesの設定は何をしているかというと、ホームディレクトリに置かれている.gitconfig.local
というファイルを、Modules毎に書き換えている。一回rmしてsymbolic linkを張りなおしている。
git/local
#%Module1.0 ## proc ModulesHelp { } { puts stderr "Git Username for Local\n" } module-whatis "Git Username for Local" # append pathes exec rm -f $::env(HOME)/.gitconfig.local exec ln -s $::env(HOME)/modules/git/git.local $::env(HOME)/.gitconfig.local
git/sub
#%Module1.0 ## proc ModulesHelp { } { puts stderr "Git Username for Sub\n" } module-whatis "Git Username for Sub" # append pathes exec rm -f $::env(HOME)/.gitconfig.local exec ln -s $::env(HOME)/modules/git/git.sub $::env(HOME)/.gitconfig.local
そして肝心の${HOME}/.gitconfig
は以下のようにしている。${HOME}/.gitconfig.local
を読み込ませるだけだ。それ以外の設定は共通なのでどこでも使える。
${HOME}/.gitconfig
[include] path = .gitconfig.local [color] ui = true [alias] graph = log --graph --date-order -C -M --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all --date=short fgraph = !git-foresta --all --style=1 --graph-symbol-commit=★ --graph-symbol-tip=☆ --graph-margin-right=2 | less -RSX co = checkout ...
例えば、git/local
環境をロードしてみる。
$ module load git/local $ git config --list include.path=.gitconfig.local user.name=msyksphinz user.email=msyksphinz_dev.gmail.com color.ui=true ...
次に、git/sub
環境をロードしてみる。
$ module load git/sub $ git config --list user.name=sub_msyksphinz user.email=sub_msyksphinz_dev.gmail.com color.ui=true
切り替えはできるようになった。
ただし、この方法も万能ではない。ユーザは作業するGitリポジトリを移るたびに、moduleを再ロードして適切なユーザ設定に切り替えなければならない。 そこはユーザの自己責任だ。gitのリポジトリを何個も持っていたり、頻繁に切り替える必要がある場合は有効だと思う。あくまでも1アイデアということで。