FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

同一環境上で複数のGitアカウントを切り替えるための1アイデア

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文により別のファイルから設定を取り込めることが分かった。

qiita.com

なるほど、ということは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/localgit/subが用意されており、それぞれユーザ名の情報を格納したgit.localgit.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アイデアということで。