<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mattsu no Rensa</title>
    <description>The latest articles on DEV Community by Mattsu no Rensa (@fpgartktic).</description>
    <link>https://dev.to/fpgartktic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4130768%2Fe9eb6f3f-4510-4471-afe1-55645ff8934f.jpg</url>
      <title>DEV Community: Mattsu no Rensa</title>
      <link>https://dev.to/fpgartktic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fpgartktic"/>
    <language>en</language>
    <item>
      <title>Git submodules can only follow branches. I wanted tags.</title>
      <dc:creator>Mattsu no Rensa</dc:creator>
      <pubDate>Fri, 18 Sep 2026 04:04:53 +0000</pubDate>
      <link>https://dev.to/fpgartktic/git-submodules-can-only-follow-branches-i-wanted-tags-3ep</link>
      <guid>https://dev.to/fpgartktic/git-submodules-can-only-follow-branches-i-wanted-tags-3ep</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://lazysubmodules.readthedocs.io/en/latest/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flazysubmodules.readthedocs.io%2Fen%2Flatest%2Fsocial-preview.png" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://lazysubmodules.readthedocs.io/en/latest/" rel="noopener noreferrer" class="c-link"&gt;
            LazySubmodules
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Track Git submodules by branch, tag, tag pattern or commit, with a lock file that catches moved tags. A command line tool for scripts and a terminal interface for people. Configuration lives in.git...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flazysubmodules.readthedocs.io%2Fen%2Flatest%2F_static%2Ffavicon.svg" width="96" height="96"&gt;
          lazysubmodules.readthedocs.io
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/FPGArtktic" rel="noopener noreferrer"&gt;
        FPGArtktic
      &lt;/a&gt; / &lt;a href="https://github.com/FPGArtktic/lazysubmodules" rel="noopener noreferrer"&gt;
        lazysubmodules
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Track git submodules by branch, tag, tag pattern or commit — CLI + TUI with a lock file
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LazySubmodules&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/FPGArtktic/lazysubmodules/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/FPGArtktic/lazysubmodules/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/FPGArtktic/lazysubmodules/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/57287c0013d59484e2bb1a75860ca571b4596447a7048457f17533e7184afe55/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f4650474172746b7469632f6c617a797375626d6f64756c65732f6261646765732f636f7665726167652e6a736f6e" alt="Coverage"&gt;&lt;/a&gt;
&lt;a href="https://lazysubmodules.readthedocs.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b53fcf5ee560bd010ac116f1a4b94bf7e02da984d1aaa1b7ec9b11a14521f6d8/68747470733a2f2f696d672e736869656c64732e696f2f72656164746865646f63732f6c617a797375626d6f64756c6573" alt="Documentation"&gt;&lt;/a&gt;
&lt;a href="https://github.com/FPGArtktic/lazysubmodules/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/991f65035b76c37fd64e4f912122557ac79d1e9851de593b062d9037e4fe4167/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f4650474172746b7469632f6c617a797375626d6f64756c65733f696e636c7564655f70726572656c6561736573" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/FPGArtktic/lazysubmodules/go.mod" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1b4f23c05485c5f3ae75d7bc29cb0db3d5291993142acd02eea2fca431cda2e8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f676f2d6d6f642f676f2d76657273696f6e2f4650474172746b7469632f6c617a797375626d6f64756c6573" alt="Go version"&gt;&lt;/a&gt;
&lt;a href="https://pkg.go.dev/github.com/FPGArtktic/lazysubmodules" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4dc1fc8a695601d33d53f1b41f2a0be7f86e305d113a4c750f41eaf7334c2e46/68747470733a2f2f706b672e676f2e6465762f62616467652f6769746875622e636f6d2f4650474172746b7469632f6c617a797375626d6f64756c65732e737667" alt="Go Reference"&gt;&lt;/a&gt;
&lt;a href="https://github.com/FPGArtktic/lazysubmodules/.golangci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bc421de14ac11b29c65c1d1f8f32073fc80799bc97e012bd14be226d91e73c2d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c696e74656425323062792d676f6c616e6763692d2d6c696e742d3030414444383f6c6f676f3d676f266c6f676f436f6c6f723d7768697465" alt="Linted by golangci-lint"&gt;&lt;/a&gt;
&lt;a href="https://github.com/FPGArtktic/lazysubmodules/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/481ff51f48dbd0b69408aaccd2b518a3d71897303d26623063eebf393874330b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d47504c2d2d332e302d2d6f6e6c792d626c7565" alt="License: GPL-3.0-only"&gt;&lt;/a&gt;
&lt;a href="https://github.com/FPGArtktic/lazysubmodules#installation" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9e433ff036ae581c4e473204030ed558be239936218cf1bf07c5ad584f0ce0f9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d6c696e7578253230616d64363425323025374325323061726d36342d6c6967687467726579" alt="Platform"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eabdd129991c91e59fc8ae8f4773161eb4ed92eae3e552cb745ca5936daae18d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d616465253230696e2d506f6c616e642d4443313433433f6c6162656c436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/eabdd129991c91e59fc8ae8f4773161eb4ed92eae3e552cb745ca5936daae18d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d616465253230696e2d506f6c616e642d4443313433433f6c6162656c436f6c6f723d7768697465" alt="Made in Poland"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/FPGArtktic/lazysubmodules/docs/demo/hero.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFPGArtktic%2Flazysubmodules%2FHEAD%2Fdocs%2Fdemo%2Fhero.gif" alt="The LazySubmodules terminal interface on a superproject with fourteen submodules: a table with the name, mode, ref, lock and colored state of each submodule, and a preview of the selected one. The recording moves through the table, opens the details of u-boot, updates u-boot after a confirmation until its state turns ok, and shows the help page."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LazySubmodules manages Git submodules that track &lt;strong&gt;branches, tags, tag
patterns or fixed commits&lt;/strong&gt;. It has a scriptable command line interface
and an interactive terminal user interface (TUI). The binary is called
&lt;code&gt;lazysubmodules&lt;/code&gt;, and &lt;code&gt;lsm&lt;/code&gt; is an optional short name.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tracking modes:&lt;/strong&gt; a submodule can follow a branch, a tag, the highest
version tag matching a glob such as &lt;code&gt;v2.*&lt;/code&gt;, or a fixed commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock file:&lt;/strong&gt; &lt;code&gt;.lsm.lock&lt;/code&gt; records what each submodule was resolved to, so
tags that were moved on the remote are detected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable network use:&lt;/strong&gt; only &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;update --fetch&lt;/code&gt; and &lt;code&gt;add&lt;/code&gt;
touch the network; everything else works on local refs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Git underneath:&lt;/strong&gt; configuration lives in &lt;code&gt;.gitmodules&lt;/code&gt;, and all
work is done by the &lt;code&gt;git&lt;/code&gt; command line tool. Plain
&lt;code&gt;git submodule update --remote&lt;/code&gt; keeps working for branch-tracking
submodules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripting:&lt;/strong&gt; a stable, machine-readable status format, &lt;code&gt;verify&lt;/code&gt; with
optional signature checks, and distinct exit codes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/FPGArtktic/lazysubmodules" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Git can make a submodule follow a branch, but there is no way to say "follow tag v2.3.1" or "follow the newest v6.6.* release", so everyone pinning submodules to releases does it by hand. I wrote a tool for it: lsm set kernel --tag-pattern 'v6.6.*', then lsm update kernel --fetch --commit. The configuration lives in .gitmodules under keys Git ignores, so anyone who clones without the tool still runs git submodule update --init and gets exactly what the superproject records.&lt;/p&gt;

</description>
      <category>git</category>
      <category>tui</category>
      <category>productivity</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
