The other night I wanted to upload some photo's to my git-annex remote on our home NAS (a Synology DS416, let's call it mallorca), but reality decided otherwise:

$ git annex copy --to mallorca path/to/nice-picture-01.jpg
fatal: Run with no arguments or with -c cmd
git-annex-shell: git-shell failed
(unable to check mallorca) failed

Cue a lengthy debugging session digging through git-over-SSH, several layers of login-shells and other redirection stumbling blocks.

I finally ended up on this bug report (by the way: not thanks to googling, which delivered very poorly, but from grepping through the git-annex source code) which points to this changelog note:

git-annex (8.20211028) upstream; urgency=medium

  This version of git-annex removes support for communicating with git-annex
  remotes that have version 6.20180312 or older installed.

Yep, that sound like my problem (local and remote version drifted too far apart):

  • locally, on my laptop, I run version 10.20220624 (recently updated with Homebrew)
  • the Synology NAS is stuck at version 6.20161212 (later releases don't run anymore)

Because I have no idea yet how to upgrade git-annex on the NAS-side I'm currently forced to downgrade laptop-side. Shouldn't be that big of an issue if you're using a package manager like Homebrew, right? Right? Turns out that Homebrew does not support easy installing of an older version of a package, e.g. by adding some kind of version constraint, as found in other package managers. There are ways to achieve installing old Homebrew formulas, but it's not trivial, barely/poorly documented while the wrong (and now defunct) way still ranks a lot higher in search results.

Anyway, as explained in this Homebrew discussion, you have to create a new "tap" of your own, "extract" the desired version of the Homebrew formula to it and install it from there. I tried that to install git-annex version 8.20211011, and in honor of Saint Murphy, the compilation failed:

==> cabal v2-install --jobs=4 --max-backjumps=100000 --install-method=copy --installdir=/usr/local/Cellar/git-annex@8.20210903/8.20210903/bin --flags=+S3
Last 15 lines from /Users/stefaan/Library/Logs/Homebrew/git-annex@8.20210903/02.cabal:

Remote/GitLFS.hs:461:46: error:
    • Couldn't match expected type ‘LFS.ServerSupportsChunks
                                    -> RequestBody’
                  with actual type ‘RequestBody’
    • In the first argument of ‘send’, namely ‘body’
      In the second argument of ‘($)’, namely ‘send body sha256 size’
      In a stmt of a 'do' block:
        forM_ (LFS.objects resp) $ send body sha256 size
461 |                                         send body sha256 size
    |                                              ^^^^
cabal: Failed to build git-annex-8.20210903. See the build log above for

Cue another session trying to figure out compilation problems with a language (Haskell) and build system (Cabal) I don't know. By luck, I found out there is a compile flag GitLfs I could turn off to work around that compilation problem and have a complete build.

Finally, after way too many hours deep down in the alien, hostile caverns of other people's code and systems, I have a working build of an old enough git-annex version. Hashtag party hat.

For posterity, I preserved my Homebrew tap for this git-annex version at git-annex@8.20211011 which can be installed with:

brew tap soxofaan/git-annex
brew install git-annex@8.20211011

Because I still had the original, latest git-annex version installed (10.20220624), I got a warning that the original symlinks were not automatically updated. Instead, I had to do the unlinking/relinking manually with

brew unlink git-annex 
brew link --overwrite git-annex@8.20211011

Ok, that's enough for now. Time to be productive again. I hope.