2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gitコミット時のメールアドレスをブランチごとに自動で切り替える方法

Last updated at Posted at 2020-03-13

モチベーション

Githubでcommitすると、コミッターのユーザー名とメールアドレスもコミットログに残って公開されてしまう。これを隠す方法。

githubはリポジトリ作成時に利用したメールアドレス以外からは、コミットを受け付けない。よって、コミットによってメールアドレスは実質公開されてしまう。

ただし、githubからnoreplyメールアドレスというものが割り当てられているので、それを利用してコミットすれば、リポジトリ製作者のメールアドレスでなくてもコミットを受け付けてもらえる。

git configでuser.emailを変更してしまうと、github以外での(ローカル作業での)コミッターのメールアドレスも変わってしまう。幸い、普段の開発ブランチと、github公開向けのブランチは分かれていて、かつ、git mergeせずにgit merge --squashなどでコミットしなおす形をとっている。よって、github向けのブランチでのコミット時だけnoreplyメールを使うようにしたい。

.gitconfigincludeIf記述を使えば、自動化を実現できる!

(注) .gitconfigincludeincludeIfを使う内容は多くの紹介記事が存在しますので、新しい話ではないです。includeIfonbranchとユーザー切り替えの記事はあまり見つけられなかったので敢えて投稿しました。忘備録ってことで許してください。

自動化しない方法(面倒だが設定は必要ない)

コマンド指定その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で自動で切り替える方法(本丸)

まず、グローバルな.gitconfiguser.nameuser.emailが記載されているとする。ここで、条件に合わせてファイルをincludeする機能を使うことで、user.nameuser.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にしたら動きました。

Reference

  1. git configをプロジェクトによって使い分ける

  2. Using gitconfig per branch

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?