<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>nunogrl.com - configuration</title><link href="https://nunogrl.com/" rel="alternate"></link><link href="https://nunogrl.com/categories/configuration/atom.xml" rel="self"></link><id>https://nunogrl.com/</id><updated>2020-08-31T10:00:00+01:00</updated><entry><title>Managing Multiple Git Configurations</title><link href="https://nunogrl.com/articles/git-config/" rel="alternate"></link><published>2020-08-31T10:00:00+01:00</published><updated>2020-08-31T10:00:00+01:00</updated><author><name>Nuno Leitao</name></author><id>tag:nunogrl.com,2020-08-31:/articles/git-config/</id><summary type="html">&lt;p class="first last"&gt;A guide to managing multiple Git configurations for different contexts (work, personal) using gitconfig&lt;/p&gt;
</summary><content type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;When working with Git across different contexts (personal projects, work repositories), it's crucial to maintain separate configurations to ensure commits are made with the correct identity and settings. This guide demonstrates how to set up and manage multiple Git configurations effectively.&lt;/p&gt;
&lt;object data="https://nunogrl.com/images/dotfiles/dotfiles.svg" style="width: 100%;" type="image/svg+xml"&gt;"My dotfiles"&lt;/object&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="first admonition-title"&gt;Warning&lt;/p&gt;
&lt;p class="last"&gt;Using incorrect Git credentials can lead to commits being associated with the wrong identity,
which may expose personal email addresses in work repositories or vice versa.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration-structure"&gt;
&lt;h2&gt;Configuration Structure&lt;/h2&gt;
&lt;div class="mermaid" id="mermaid-diagram-6678110844685110560"&gt;
flowchart TD
   A[~/.gitconfig] --&gt; B[~/.gitconfig-personal]
   A --&gt; C[~/.gitconfig-work]
   B --&gt; D[Personal Repos]
   C --&gt; E[Work Repos]&lt;/div&gt;&lt;/div&gt;
&lt;div class="section" id="primary-configuration"&gt;
&lt;h2&gt;Primary Configuration&lt;/h2&gt;
&lt;p&gt;The main &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.gitconfig&lt;/span&gt;&lt;/tt&gt; file serves as the entry point for Git's configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[includeIf &amp;quot;gitdir:~/src/*&amp;quot;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.gitconfig-work&lt;/span&gt;

&lt;span class="k"&gt;[includeIf &amp;quot;gitdir:~/src/sandbox/*&amp;quot;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.gitconfig-personal&lt;/span&gt;

&lt;span class="k"&gt;[includeIf &amp;quot;gitdir:~/Documents/*&amp;quot;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.gitconfig-personal&lt;/span&gt;

&lt;span class="k"&gt;[includeIf &amp;quot;gitdir:~/src/&amp;quot;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/Documents/git-work-precommit&lt;/span&gt;

&lt;span class="k"&gt;[commit]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;gpgsign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;lg1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;log &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--graph &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--abbrev-commit &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--decorate &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--format=format:&amp;#39;%C(bold blue)%h%C(reset) - &lt;/span&gt;\
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;%C(bold green)(%ar)%C(reset) &lt;/span&gt;\
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;%C(white)%s%C(reset) %C(dim white)- &lt;/span&gt;\
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;%an%C(reset)%C(bold yellow)%d%C(reset)&amp;#39; &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--all&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;lg2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;log &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--graph &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--abbrev-commit &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--decorate &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--format=format:&amp;#39;%C(bold blue)%h%C(reset) - &lt;/span&gt;\
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;%C(bold cyan)%aD%C(reset) &lt;/span&gt;\
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;%C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n&amp;#39;&amp;#39;&lt;/span&gt;\
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s"&gt;%C(white)%s%C(reset) %C(dim white)- %an%C(reset)&amp;#39; &lt;/span&gt;\
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s"&gt;--all&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;!&amp;quot;git lg1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;diffc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;diff --color-words=.&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;meld&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;difftool --tool=meld -y&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;meldd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;difftool --dir-diff --tool=meld&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;meldbase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;!git meld $(git merge-base origin/master HEAD)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;review&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;!git fetch $1 $2 &amp;amp;&amp;amp; git checkout FETCH_HEAD &amp;amp;&amp;amp; git meldbase &amp;amp;&amp;amp; true&lt;/span&gt;

&lt;span class="k"&gt;[core]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;vim&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="personal-git-configuration"&gt;
&lt;h2&gt;Personal Git Configuration&lt;/h2&gt;
&lt;p&gt;Create &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.gitconfig-personal&lt;/span&gt;&lt;/tt&gt; for personal projects:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[user]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Nuno Leitao&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example@example.com&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;signingkey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1234ABCD&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="work-git-configuration"&gt;
&lt;h2&gt;Work Git Configuration&lt;/h2&gt;
&lt;p&gt;Create &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.gitconfig-work&lt;/span&gt;&lt;/tt&gt; for work-related projects:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[user]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Nuno Leitao&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;example@acme.com&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;signingkey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;1234ABCD&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="gpg-key-configuration"&gt;
&lt;h2&gt;GPG Key Configuration&lt;/h2&gt;
&lt;p&gt;The same GPG key can be used for both configurations:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt; $ &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;-K
&lt;span class="go"&gt; /home/nuno/.gnupg/pubring.kbx&lt;/span&gt;
&lt;span class="go"&gt; -----------------------------&lt;/span&gt;
&lt;span class="go"&gt; sec   rsa4096 2018-05-09 [SC] [expires: 2022-05-09]&lt;/span&gt;
&lt;span class="hll"&gt;&lt;span class="go"&gt;       123456789ABCDEFG56780000123456781234ABCD&lt;/span&gt;
&lt;/span&gt;&lt;span class="go"&gt; uid           [ultimate] Nuno Leitao &amp;lt;example@example.com&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt; uid           [ultimate] Nuno Leitao &amp;lt;example@acme.com&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt; uid           [ultimate] [jpeg image of size 10099]&lt;/span&gt;
&lt;span class="go"&gt; ssb   rsa4096 2018-05-09 [E] [expires: 2022-05-09]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;The GPG key is associated with multiple email addresses, allowing it to sign
commits for both personal and work accounts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="key-considerations"&gt;
&lt;h2&gt;Key Considerations&lt;/h2&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="first admonition-title"&gt;Tip&lt;/p&gt;
&lt;ul class="last simple"&gt;
&lt;li&gt;Always verify the active Git configuration before starting work on a new repository&lt;/li&gt;
&lt;li&gt;Use &lt;tt class="docutils literal"&gt;git config &lt;span class="pre"&gt;--list&lt;/span&gt;&lt;/tt&gt; to check current settings&lt;/li&gt;
&lt;li&gt;Consider adding repository-specific configurations for special cases&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="common-issues"&gt;
&lt;h2&gt;Common Issues&lt;/h2&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Wrong Email in Commits&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you notice commits with incorrect email:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;--amend&lt;span class="w"&gt; &lt;/span&gt;--author&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Nuno Leitao &amp;lt;correct@email.com&amp;gt;&amp;quot;&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;--force&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Use with caution!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;strong&gt;Verifying Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check active configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--list&lt;span class="w"&gt; &lt;/span&gt;--show-origin
&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="further-reading"&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://git-scm.com/docs/git-config"&gt;Git Config Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs"&gt;Pretty Git Branch Graphs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://mikegerwitz.com/2012/05/a-git-horror-story-repository-integrity-with-signed-commits"&gt;A Git Horror Story: Repository Integrity with Signed Commits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="Shell Script &amp; Setup Symphony"></category><category term="dotfiles"></category><category term="git"></category><category term="configuration"></category><category term="security"></category></entry></feed>