kenju's blog

About Programming and Mathematics

社内GHEとGitHub用のGit Author/Emailを分ける方法

基本的には、社内PCを使っているので、

git config --global user.name "ghe author name"
git config --global user.email "me@example.com"

とGloballyには社内用GHEアカウントでGitを定義した上で、GitHub用のアカウントを使いたいレポジトリでは、

git config --local user.name "github author name"
git config --local user.email "me@example.com"

を実行すれば良い。

ただし、これだとGitHub用のレポジトリが多い場合にただひたすらに面倒なので、冪等性を持つ以下のoneshotスクリプトを書いた。 自分はghqでレポジトリのローカル管理をしているので、$HOME/.ghq/github.com/myaccountname配下のレポジトリに対してgit config --localを実行するコマンドを発行すれば良い。

なお、過去の履歴を書き換えたい場合用に、git filter --branchを利用して過去の履歴をガット書き換えている。

#!/usr/bin/env ruby
#
# this script has idempotence

def execute_command(code)
  puts("Executing...")
  puts(code)
  system(code)
end

def change_git_config
  execute_command <<~CODE
  # change
  git config --local user.name #{author_name}
  git config --local user.email #{author_email}
  # show
  git config user.name
  git config user.email
  CODE
end

def change_all_git_history_author
  execute_command <<~CODE
  git filter-branch -f \
    --env-filter "\
      GIT_AUTHOR_NAME='#{author_name}'; \
      GIT_AUTHOR_EMAIL='#{author_email}'; \
      GIT_COMMITTER_NAME='#{author_name}'; \
      GIT_COMMITTER_EMAIL='#{author_email}';" \
      HEAD
  CODE
end

def author_name
  "me"
end

def author_email
  "me@example.com"
end

ghe_dir = "#{ENV['HOME']}/.ghq/github.com/kenju"
Dir.glob("#{ghe_dir}/*").each do |dir|
  Dir.chdir dir

  change_git_config
  change_all_git_history_author
end