In DataLad, there are some dotfiles that we want to annex (e.g. .datalad/metadata/objects/*), so we need to set annex.dotfiles=true. Ideally that would be in effect for annex commands that DataLad executes without setting annex.dotfiles=true in the repo. DataLad configuring annex.dotfiles in the repo seems problematic because the change in behavior would be surprising to users that call git annex add directly. And more generally, DataLad should be able to operate in existing git(-annex) repos without changing configuration values in the background.

That reasoning leads to using -c annex.dotfiles=true in our calls to git-annex. By doing that combined with --force-large, we can make git annex add send a dotfile to the annex. However, if the file is later unlocked, it switches to being store in git, presumably when the clean filter runs. The script below provides a concrete example of this when running on an unlocked adjusted branch.

So, I think this is expected behavior. annex.dotfiles=true is no longer in effect when the clean filter runs, and the dotfile goes into git instead. The only way I can think of to work around this annex->git conversion is to set annex.dotfiles=true in the repo. But, as I mentioned in the first paragraph, I'm hoping to avoid that. Is there another solution that I'm overlooking?

#!/bin/sh

set -eux

cd "$(mktemp -d --tmpdir gx-XXXXXXX)"

echo $(git annex version --raw)
git init
git annex init
git commit --allow-empty -mc0
git annex adjust --unlock

echo one >.dot
git annex add -c annex.dotfiles=true --force-large .dot
git commit -mdot
git diff
+ mktemp -d --tmpdir gx-XXXXXXX
+ cd /tmp/gx-dVCRKik
+ git annex version --raw
+ echo 8.20200226
8.20200226
+ git init
Initialized empty Git repository in /tmp/gx-dVCRKik/.git/
+ git annex init
init  (scanning for unlocked files...)
ok
(recording state in git...)
+ git commit --allow-empty -mc0
[master (root-commit) 594fa63] c0
+ git annex adjust --unlock
adjust
Switched to branch 'adjusted/master(unlocked)'
ok
+ echo one
+ git annex add -c annex.dotfiles=true --force-large .dot
add .dot
ok
(recording state in git...)
+ git commit -mdot
[adjusted/master(unlocked) 826ad5d] dot
 1 file changed, 1 insertion(+)
 create mode 100644 .dot
+ git diff
diff --git a/.dot b/.dot
index 9a70ce7..5626abf 100644
--- a/.dot
+++ b/.dot
@@ -1 +1 @@
-/annex/objects/SHA256E-s4--2c8b08da5ce60398e1f19af0e5dccc744df274b826abe585eaba68c525434806.dot
+one