This is an upstream resubmission of Debian bug #959506.

Please describe the problem.

As of v8, git-annex divides files into “large” and “non-large” files, the former of which are supposed to be automatically added to the annex and the latter to vanilla git when running git annex add. git-annex uses the configuration option annex.largefiles, a file matching expression, to categorize files as “large”; all other files end up as “non-large”.

Furthermore, git-annex always treats “dotfiles” as “non-large”, without consulting annex.largefiles. Setting the configuration option annex.dotfiles (false by default) makes git-annex use annex.largefiles to also categorize “dotfiles”.

The manual never defines which files are considered “dotfiles”, therefore I am assuming a definition of “a dotfile is a non-directory file whose basename begins with an ASCII period”. git-annex however will treat any file in any directory as a dotfile – i.e., it will ignore annex.largefiles and always add the file to vanilla git, unless annex.dotfiles is set to true – as long as the relative pathname to the file begins with an ASCII period, e.g. .foo/bar.txt (which is not a dotfile according to the assumed definition above). git-annex will further cease treating the same file as a dotfile if the relative pathname no longer begins with an ASCII period, e.g. because the working directory has been changed.

I expect git-annex to distinguish between dotfiles and non-dotfiles solely by looking at the file's basename, even if the relative path to the file begins with a dot. I also expect annex.dotfiles to have no influence whatsoever on files whose basename doesn't begin with an ASCII period, even if the containing directory does. git-annex's actual behavior is highly counter-intuitive to the notion that being a dotfile is a property of the file's (base-)name. Due to the lack of definition of dotfiles in the manual, it is unclear to me whether this is intended (but in my opinion quirky) behavior, or rather a bug.

What steps will reproduce the problem?

  1. Set up a repository for use with git-annex. Leave annex.dotfiles at its default value (false), and annex.largefiles unset.

  2. Create files bar1, bar2 and bar3 within a directory .foo. What matters is that .foo begins with a period, bar1 etc. don't.

  3. Run git annex add .foo/bar1. git-annex will have forced the file into vanilla git as a “non-large” file, because it is recognized as a “dotfile”. But bar1 is not a dotfile because it does not begin with a period.

  4. (Optional.) Set annex.dotfiles to true and run git annex add .foo/bar2. The file is added to the annex. In conjunction with step 3, this shows that git-annex really does apply the annex.dotfiles setting to files such as .foo/bar2, even if they aren't “dotfiles” because the file basenames don't start with a period.

  5. (Optional.) Set annex.dotfiles back to false, change directory to .foo, then run git annex add bar3. The file will be added to the annex, as it is no longer recognized as a dotfile. This shows that git-annex's behavior is inconsistent: the same file is either seen as a dotfile or not, depending on which directory git-annex is run from and what the resulting relative pathnames look like.

What version of git-annex are you using? On what operating system?

git-annex v8.20200330, on Debian sid, as of 2020-05-08

Please provide any additional information below.

$ cd /tmp/git-annex-dotfiles
$ git init
Initialized empty Git repository in /tmp/git-annex-dotfiles/.git/
$ git annex init
init  (scanning for unlocked files...)
ok
(recording state in git...)
$ mkdir .foo
$ echo a > .foo/bar1
$ echo b > .foo/bar2
$ echo c > .foo/bar3
$ git annex add .foo/bar1   # I expect this to be added to the annex, but no
add .foo/bar1 (non-large file; adding content to git repository) ok
(recording state in git...)
$ git config annex.dotfiles true
$ git annex add .foo/bar2   # clearly affected by annex.dotfiles
add .foo/bar2
ok
(recording state in git...)
$ git config annex.dotfiles false
$ cd .foo
$ git annex add bar3        # clearly affected by the exact relative pathname
add bar3
ok
(recording state in git...)

Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)

Yes. git-annex has been in use on my end for a couple of years, and it is my go-to solution for “want something versioned, but can't store the contents themselves (too big, too sensitive, etc.)?”. Furthermore, git-annex documentation in general is excellent. But that is also why I'm stumped that the manual is so silent on this point.

fixed by resolving inconsistent behavior. Also improved documentation to be clear that dot directories are treated same as dotfiles.