私の Git アイデンティティ設定方法
(benji.dog)- 個人・業務リポジトリをすべて
~/workspaceに置く環境では、フォルダ位置よりも remote URL を基準に Git アイデンティティを分けるほうが正確 - Git の
includeIfはgitdirでパスごとの設定を読み込めるが、同じ作業ディレクトリ内に複数アカウントのリポジトリが混在すると パス基準の分岐 は限界にぶつかる hasconfig:remote.*.url:条件を使えば、GitHub、GitLab、SourceHut、特定の GitHub 組織のように remote URL パターンに応じて別の設定ファイルを含められる- SSH キーは
~/.ssh/configでHost、Hostname、User、IdentityFileを使って別管理する必要があり、同じgithub.comでも組織ごとのキーを使うには Host エイリアス が必要 url.<base>.insteadOfをあわせて設定すると、普段どおりgit@github.com:orgname/projectを使いながらも、内部的にはgh-work:orgnameに置換されて正しい SSH 設定が使われる
remote URL 基準で Git 設定を分ける
- 既存の
includeIfの例では、gitdir:~/code/**、gitdir:~/work/**のように ローカルディレクトリのパス に応じて別の設定ファイルを含める~/code配下では~/.config/git/personal、~/work配下では~/.config/git/workを読み込める- 含まれるファイルには通常、
user.name、user.email、user.signingkeyのような Git アイデンティティや署名キーが入る
- すべてのコードを
~/workspace配下に置くと、個人、work-1、work-2のリポジトリが同じパス構造に混在し、パスベースの条件だけでは望む区別が難しい - Git の
hasconfig:remote.*.url:を使うと、現在のリポジトリに特定の remote URL があるときだけ設定ファイルを含められるgit@github.com:*/**に一致すれば~/.config/git/config-ghgit@github.com:orgname/**に一致すれば~/.config/git/config-gh-orggit@gitlab.com:*/**に一致すれば~/.config/git/config-glgit@git.sr.ht:*/**に一致すれば~/.config/git/config-srht
- Git は最後にマッチした設定を読み込むため、条件の順序 が重要
github.com:orgname/**条件は一般のgithub.com:*/**条件より下に置かないと、組織専用設定が通常の GitHub 設定で上書きされてしまう
- 結果として、
github.com:orgname/**の remote を持つリポジトリはconfig-gh-orgを使い、それ以外の GitHub リポジトリは通常の GitHub 設定を使う
SSH キーと insteadOf で組織別の接続情報を合わせる
- Git アイデンティティとは別に、remote に
pull・pushするには SSH キー設定 が必要~/.ssh/configでgitlab.comには~/.ssh/gitlab.id_ed25519github.comには~/.ssh/github.id_ed25519のようにIdentityFileを指定できる
ssh-agentの設定によっては、各HostのIdentityFileの下にIdentitiesOnly yesを追加したほうがよい場合がある- 同じ
Hostnameであるgithub.comで組織ごとに異なるキーを使うには、Hostの値を変える必要がある- 構成は
Host gh-work、Hostname github.com、User git、IdentityFile ~/.ssh/work.id_ed25519の形になる
- 構成は
- Git 設定の
url "gh-work:orgname"とinsteadOf = git@github.com:orgnameを使うと、Git URL を自動置換できる- 利用者は
git clone git@github.com:orgname/projectのように入力する - Git は
github.com:orgnameの部分をgh-work:orgnameに置き換え、~/.ssh/configのgh-work設定を使う
- 利用者は
- この方法は SSH and multiple Git credentials で紹介されていたテクニックで、あわせて参考にした記事は次のとおり
1件のコメント
Hacker News のコメント
insteadOfの代わりにリポジトリをgh-work:org/repoとしてクローンし、Git 設定にはincludeIf "hasconfig:remote.*.url:gh-work:**/**"を入れるこうすると、
gh-work配下で定義された SSH アイデンティティでクローンしたリポジトリはgh-work.inc設定を自動的に取り込み、その中には Git のアイデンティティや SSH 設定と同じ署名キーが入る結果として
gh-workという名前が SSH アイデンティティと Git アイデンティティを区別する基準になり、より理解しやすいincludeIfは大文字小文字を区別し、優先順位は最後の設定が勝つ正しく動作しているか確認するには、
git remote get-url originとgit config --get user.emailを実行すればよいより良い方法は、
HOMEの.gitconfigにアイデンティティ別のエイリアスを置き、リポジトリの初期化やクローン直後にgit config-companyまたはgit config-personalを実行することだと思うuser.useConfigOnly = trueを有効にし、エイリアスでローカルリポジトリのuser.email、user.name、core.sshCommandをそれぞれ個人用/会社用 SSH キーに設定すればよい記事の方法は、組織からクローンすればそのまま動く点が利点に見える
以前あるスタートアップに、毎日おとぎ話のような適当な名前にアイデンティティを変える人がいた
月曜日のコミットは Mr. Bunnymann、火曜日のコミットは Doctor Funtime といった具合で、バージョン管理フォレンジックをする時に非常に不便だった
好意的に見れば、誰でもアイデンティティ設定に任意の値を入れられるので、その値をあまり信用しすぎてはいけないと思い出させようとしていたのかもしれない
それでも詳細を尋ねたり、スタイルや専門性を推測したりするには、誰がやったかを知ることが役に立つ
コミットに GPG 署名を要求し、許可された GPG アイデンティティを登録すれば、author/committer メタデータの代わりに署名で実際の作者を識別できる
もちろん「簡単に」と GPG 署名は、いつも相性がよいわけではない
従業員が自分のコミットを正しく識別できないと信じられないなら、解雇すべきだと思う
~/.ssh/configを触る必要はなく、~/.gitconfigや記事のように~/.config/git/personalにcore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -aを入れればよいこうすれば
insteadOfなしでもサブモジュールが楽になる以前からディレクトリベースの
includeIfを使ってきたが(https://www.bobek.cz/til/git-identities/)、hasconfig:remoteは本当にすっきりしているリポジトリをクローンする時にも動作する
includeIfはかなり良い今は SSH の複雑さを
~/.sshに置き、顧客/プロジェクト/アイデンティティごとに include を1つずつ置いているGitHub のように固有のホスト名がないものには
customer-githubのようなホストエイリアスを付け、HostName github.com、IdentityFile ~/.ssh/customer_rsa、User gitのように設定するあとは
git cloneでそのエイリアスを使うだけで終わり同じ問題があり、これで解決策ができたことになる
NixOS と home-manager を Linux と Mac で使うと、この設定は簡単になる
programs.git.includesにcondition = "hasconfig:remote.*.url:git@github.com:/**"とuser.email設定を入れればよい参考: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigに書くより簡単には見えない記事と同じ条件と設定なのに、そこにビルド/テンプレート段階と、独特な文法の新しいプログラミング言語の学習まで追加される
すでに
includeIf: "gitdir"で仕事用と個人用の設定を分けていたが、hasconfig:remoteは完全にゲームチェンジャーだコンサルタントには、仕事用には常に別マシンを使うか、少なくとも別の OS ユーザーを使うよう強く勧めている
個人用マシンを仕事に使うと、大きな面倒に巻き込まれるリスクがある
リモートファーストの会社でノートPCを自分で用意し、2〜3年ごとに新しい機器の購入費を受け取っていたが、それでも個人ノートPCだった場合もあるし、臨時契約者の場合もある
どの状況でなぜ問題になるのか、もっと具体的に説明すべきだ
リスクは実際にあるが、列挙できないなら教育ではなく FUD を広めるのに近くなる
プロジェクトごとに Git アイデンティティを簡単に切り替えるために作ったツール: https://github.com/cquintana92/git-switch-user
アイデンティティを設定した後、
$ git su Personalまたは$ git su Workを実行すると、メール、名前、SSH キー、任意で PGP キーまでリポジトリの.git/configに設定されるかなり時間を節約してくれた
12年前のツールだが、今も活発にメンテナンスされている