<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Git on blog.bdw.li</title>
    <link>https://blog.bdw.li/tags/git/</link>
    <description>Recent content in Git on blog.bdw.li</description>
    <language>en</language>
    <managingEditor>hello@bdw.li (jwb)</managingEditor>
    <webMaster>hello@bdw.li (jwb)</webMaster>
    <lastBuildDate>Fri, 13 Feb 2026 21:43:56 +0100</lastBuildDate>
    <atom:link href="https://blog.bdw.li/tags/git/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>gitconfig and includeIf Statements</title>
      <link>https://blog.bdw.li/gitconfig-and-includeif-statements/?ref=rss</link>
      <pubDate>Tue, 13 Feb 2024 23:15:20 +0100</pubDate><author>hello@bdw.li (jwb)</author>
      <guid>https://blog.bdw.li/gitconfig-and-includeif-statements/?ref=rss</guid>
      <description>If/else branches in a configuration file feel like a niche feature, but for mixed work environments it&amp;rsquo;s perfect.</description>
      <content:encoded><![CDATA[<p>Over the day I was using different machines to work on some git files. One machine was running Ubuntu, the other one Windows. Since I started using GPG keys to sign my commits a few weeks ago, I wondered how I could streamline my config files. A dotfile repository seemed to be the answer.</p>
<p>While I did some research on that, I stumbled upon the nifty feature of <code>IncludeIf</code> in <code>.gitconfig</code><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I could use this to split up the configuration files to match the different Operating Systems.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">~
</span></span><span class="line"><span class="cl">├───.gitconfig
</span></span><span class="line"><span class="cl">├───.gitconfig-linux
</span></span><span class="line"><span class="cl">├───.gitconfig-windows
</span></span><span class="line"><span class="cl">├───.gitconfig-github
</span></span><span class="line"><span class="cl">└───.gitconfig-gitlab
</span></span></code></pre></div><p><em>VSCodium on Windows seems to require the <code>gitdir/i</code> parameter to work<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, Github<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</em></p>
<h1 id="gitconfig">.gitconfig</h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>includeIf <span class="s2">&#34;gitdir/i:c:/&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">path</span> <span class="o">=</span> ~/.gitconfig-windows
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl"><span class="o">[</span>includeIf <span class="s2">&#34;gitdir:/home&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">path</span> <span class="o">=</span> ~/.gitconfig-linux
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>includeIf <span class="s2">&#34;gitdir:~/Git/&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">path</span> <span class="o">=</span> ~/.gitconfig-github
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>includeIf <span class="s2">&#34;gitdir:~/Gitlab/&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">path</span> <span class="o">=</span> ~/.gitconfig-gitlab
</span></span></code></pre></div><p>The tilde &ldquo;<code>~</code>&rdquo; is nowadays an alias for the <code>HOME</code> variable on all major systems. On Windows it will show <code>C:\Users\$username</code>, on Linux it will be <code>/home/$username</code>. (And on macOS probably something like <code>/Users/$username</code>, but I didn&rsquo;t check.)</p>
<p>First, <code>includeIf</code> checks if the path of the git directory we are currently working in, starts with a <code>C:\</code>. If so, we are apparently on a Windows machine and include the configuration from <code>C:\Users\$username\.gitconfig-windows</code>.</p>
<p>The next check is for Linux systems. If the path starts with <code>/home</code> we include the linux config from <code>/home/$username/.gitconfig-linux</code>.</p>
<p>Once these are finished, we check if the path has <code>/Git/</code> or <code>/Gitlab/</code> in it. This is a personal preference of mine. I like to sort the repositories I work on into folders based on the provider.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">Git</span> <span class="o">=</span> Github
</span></span><span class="line"><span class="cl"><span class="nv">Gitlab</span> <span class="o">=</span> Gitlab
</span></span></code></pre></div><h1 id="gitconfig-linux--gitconfig-windows">.gitconfig-linux // .gitconfig-windows</h1>
<p>These files only show the path to the gpg binary, to assist in signing the commits.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># .gitconfig-linux</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>gpg<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">program</span> <span class="o">=</span> /usr/bin/gpg2
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># .gitconfig-windows</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>gpg<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">program</span> <span class="o">=</span> c:/Program Files <span class="o">(</span>x86<span class="o">)</span>/GnuPG/bin/gpg.exe
</span></span></code></pre></div><h1 id="gitconfig-github--gitconfig-gitlab">.gitconfig-github // .gitconfig-gitlab</h1>
<p>Again, the files are pretty similar and will share the same configuration items. The content, however, is different.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># .gitconfig-github</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>user<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">email</span> <span class="o">=</span> 19500486-josephbadow@users.noreply.gitlab.com
</span></span><span class="line"><span class="cl"><span class="nv">name</span> <span class="o">=</span> josephbadow
</span></span><span class="line"><span class="cl"><span class="nv">signingkey</span> <span class="o">=</span> 962215312718E4709B8F48240A05C906BDF59822 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>commit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">gpgsign</span> <span class="o">=</span> <span class="nb">true</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># .gitconfig-gitlab</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>user<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">email</span> <span class="o">=</span> 19500486-josephbadow@users.noreply.gitlab.com
</span></span><span class="line"><span class="cl"><span class="nv">name</span> <span class="o">=</span> josephbadow
</span></span><span class="line"><span class="cl"><span class="nv">signingkey</span> <span class="o">=</span> 962215312718E4709B8F48240A05C906BDF59822 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>commit<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">gpgsign</span> <span class="o">=</span> <span class="nb">true</span>
</span></span></code></pre></div><p>You can actually use <code>git config --show-origin --get gpg.program</code> to let git show you the value of the parameter (<code>gpg.program</code> in this case) and the config file where it was found.</p>
<hr>
<p>All this allows me to use one set of configuration files on all my machines. My commits automagically use the proper gpg binary and git credentials, as long as I stay true to my folder structure with Git for Github and Gitlab for, well, Gitlab.</p>
<p>I like it!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://git-scm.com/docs/git-config" target="_blank" rel="noopener noreferrer">https://git-scm.com/docs/git-config</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://stackoverflow.com/a/55107009/22461849" target="_blank" rel="noopener noreferrer">https://stackoverflow.com/a/55107009/22461849</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>
    <a href="https://github.com/Microsoft/vscode/issues/62921#issuecomment-437693020" target="_blank" rel="noopener noreferrer">https://github.com/Microsoft/vscode/issues/62921#issuecomment-437693020</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Git submodules and newly cloned repositories</title>
      <link>https://blog.bdw.li/git-submodules-and-newly-cloned-repositories/?ref=rss</link>
      <pubDate>Wed, 01 Nov 2023 08:30:25 +0100</pubDate><author>hello@bdw.li (jwb)</author>
      <guid>https://blog.bdw.li/git-submodules-and-newly-cloned-repositories/?ref=rss</guid>
      <description>A quick reminder for myself</description>
      <content:encoded><![CDATA[<p>As a reminder for my future self: If one clones a repository to a new location, the submodules are not cloned automatically. They need to be initialized and updated once, in order to show the proper content.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git submodule init
</span></span><span class="line"><span class="cl">git submodule update
</span></span></code></pre></div><p>If the theme is a submodule and the customizations are in a different branch, one needs to switch to that particular branch as well. D&rsquo;oh!</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git checkout live
</span></span></code></pre></div>]]></content:encoded>
    </item>
  </channel>
</rss>
