On a related note, git supports incorporating custom commands via executables available in the `PATH` having the naming convention of:<p><pre><code> git-<command name>
</code></pre>
Where "command name" in this case would be `archive-branch` and could be defined thusly:<p><pre><code> #!/bin/sh
# git-archive-branch
git_branch="${1:-$(git branch --show-current)}"
git co main &&
git tag archive/$git_branch $git_branch &&
git branch -D $git_branch
</code></pre>
It then could be invoked the same as the alias:<p><pre><code> git archive-branch ...</code></pre>
Seems like a sensible way to archive branches. It's not like a tag and branch are actually very different anyway, right? A tag is a pointer that always refers to the same commit while a branch is a pointer that follows commits forward. And for something that's archived, you don't need the pointer updating mechanism.
> A tag is a pointer that always refers to the same commit<p>It's not guaranteed not to change. The UI just makes it harder to update.
Correct.<p>One is refs/heads/<name> and the other is refs/tags/<name><p>Branches are expected to change. When a commit is authored, HEAD (the current branch) updates to that commit.<p>Tags are expected not to change (though they can).
> Important note: the strange magic requires the official git completion script.<p>I dislike the official git completion script because it’s so slow when working with large repos. On macOS - because of vagaries of the way its file system works - with large repos it’s effectively unusable. Hint to completion script writers: if your “smart” completion ever takes seconds, it’s worse than useless and far worse than “dumb” filename completion.
How often did you go back to the archived tagches that are older than say, 6 months ? Seems very niche, unless dunno, there are no version tags in the repo.
IMO a cleaner way to do this is with a headless remote, either on disk or “backed up” on a server. `git push —-all` won’t delete refs on the remote, so you don’t have to do any additional work to record or recover them.<p>`git push —all backup` will record all of your refs and tags<p>If you are archiving branches in your own rep, prefix with `ar/` so you can grep -v to conceal them.<p>See also `git notes` to record metadata an against a commit without changing the commit