モチベーション
Githubでcommitすると、コミッターのユーザー名とメールアドレスもコミットログに残って公開されてしまう。これを隠す方法。
githubはリポジトリ作成時に利用したメールアドレス以外からは、コミットを受け付けない。よって、コミットによってメールアドレスは実質公開されてしまう。
ただし、githubからnoreplyメールアドレスというものが割り当てられているので、それを利用してコミットすれば、リポジトリ製作者のメールアドレスでなくてもコミットを受け付けてもらえる。
git config
でuser.emailを変更してしまうと、github以外での(ローカル作業での)コミッターのメールアドレスも変わってしまう。幸い、普段の開発ブランチと、github公開向けのブランチは分かれていて、かつ、git merge
せずにgit merge --squash
などでコミットしなおす形をとっている。よって、github向けのブランチでのコミット時だけnoreplyメールを使うようにしたい。
.gitconfig
にincludeIf
記述を使えば、自動化を実現できる!
(注) .gitconfig
にinclude
やincludeIf
を使う内容は多くの紹介記事が存在しますので、新しい話ではないです。includeIf
のonbranch
とユーザー切り替えの記事はあまり見つけられなかったので敢えて投稿しました。忘備録ってことで許してください。
自動化しない方法(面倒だが設定は必要ない)
コマンド指定その1
git commit時のオプションで-c
を指定する。このとき、gitとcommitの間に書く必要がある。```
git -c user.name='foobar' -c user.email='foobar@example.com' commit -m 'message'
### コマンド指定その2
git commitのオプションで--authorを使う。これはcommitの後に書くようにする。```
git commit -m 'message' --author 'First M Family <author@example.com>'
.gitconfig のconditionIfで自動で切り替える方法(本丸)
まず、グローバルな.gitconfig
にuser.name
とuser.email
が記載されているとする。ここで、条件に合わせてファイルをincludeする機能を使うことで、user.name
とuser.email
をブランチやリポジトリごとに切り替えることができる。
ここでは、ブランチごとに切り替えることにする。想定として、普段のクローズドな開発ではクラウドストレージや社内サーバーでリモートリポジトリを運用し、そこにmasterブランチやdevelopブランチも紐づいているとする。Github公開用には、gh-master
ブランチを作って、ローカルのgh-master
ブランチを、github上のmaster
ブランチへpushする運用とする。例えば、以下のようなpush運用だ。```
$ git push github gh-master:master
この場合に、クローズドな`master`,`develop`ブランチでは、プライベートメールアドレスでコミットし、`gh-master`ブランチではGithubのnoreplyメールアドレスでコミットしたい。そこで、`conditionIf`の`onbranch`条件を使って、branch名が`gh-master`の場合だけは、`user.name`と`user.email`に上書きする。
最初に、`~/.gitconfig`に次のような記述を行う。
[user]
name = private your name
email = yourname@private.jp
...
...
...
[includeIf "onbranch:gh-master"]
path = ~/.github-noreply
さらに、`~/.github-noreply`ファイルを作成して、次のようにnoreplyのメールアドレスを書き込む```
[user]
name = public your name
email = 12345678+username@users.noreply.github.com
セキュリティー的には、~/.github-noreply
ファイルはgit管理しているディレクトリの外に置いておいた方がよいだろう。間違って公開しないように。ここでは.gitconfig
と同じホームディレクトリに置いた。
実際に上手く設定できているなら次のようになる。
$ git checkout master
$ git config user.email
yourname@private.jp
$ git checkout gh-master
$ git config user.email
12345678+username@users.noreply.github.com
同様にgh-pages
などもonbranchで設定してやると良さそう。
注意
gitのversionが2.13以降が必要1といわれていたり、2.23以降が必要2と言われていたりします。動かない時はversionを上げてみてください。実際Git for windowsの2.10では動かず、2.25にしたら動きました。