Please describe the problem.

A seemingly harmless script causes data loss by dropping last copy of file content.

In my test this script only drops file content on Windows. On Linux it's working good, even on a crippled filesystem.

What steps will reproduce the problem?

run the following script test.sh:

mkdir a
cd a
git init
git annex init first
mkdir folder
echo foo > folder/1.txt
git annex add .
git annex sync
cd ..
git clone a b
cd b
git annex init second
git annex sync
cd ../a
git remote add second ../b
git annex sync
git annex move --to second
git annex sync
mv folder folder1
git annex add
git annex sync
cd ../b
git annex sync

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

git-annex version: 6.20161231-gc8eeb17

Windows 10.0.14393 and also Windows 8

Please provide any additional information below.

# a complete transcript of the problem occurring.
$ ./test.sh
Initialized empty Git repository in A:/a/.git/
init first
  Detected a filesystem without fifo support.

  Disabling ssh connection caching.

  Detected a crippled filesystem.

  Enabling direct mode.
ok
(recording state in git...)
add folder/1.txt ok
(recording state in git...)
commit  ok
Cloning into 'b'...
done.
init second
  Detected a filesystem without fifo support.

  Disabling ssh connection caching.

  Detected a crippled filesystem.
(merging origin/git-annex into git-annex...)
(recording state in git...)

  Enabling direct mode.
ok
(recording state in git...)
commit  ok
pull origin
ok
push origin
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 664 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To A:/a
 * [new branch]      git-annex -> synced/git-annex
ok
commit  ok
pull second
From ../b
 * [new branch]      annex/direct/master -> second/annex/direct/master
 * [new branch]      git-annex           -> second/git-annex
 * [new branch]      master              -> second/master
 * [new branch]      synced/master       -> second/synced/master
ok
move folder/1.txt (to second...)
1.txt
              4 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)
(checksum...) ok
(recording state in git...)
commit  ok
pull second
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From ../b
   fd774cb..1aba4de  git-annex  -> second/git-annex
ok
(merging second/git-annex into git-annex...)
(recording state in git...)
push second
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 827 bytes | 0 bytes/s, done.
Total 10 (delta 3), reused 0 (delta 0)
To ../b
 * [new branch]      git-annex -> synced/git-annex
ok
add folder1/1.txt ok
(recording state in git...)
commit  (recording state in git...)
ok
pull second
ok
push second
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 687 bytes | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
To ../b
   7ba3e8a..ee8025b  git-annex -> synced/git-annex
   0758cf9..6e91185  annex/direct/master -> synced/master
ok
commit  ok
merge synced/master
Updating 0758cf9..6e91185
Fast-forward
 {folder => folder1}/1.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename {folder => folder1}/1.txt (100%)
error: duplicate parent 6e91185c7c64569b275a09be1a104a1d8955e1fb ignored
ok
pull origin
From A:/a
   0758cf9..6e91185  annex/direct/master -> origin/annex/direct/master
   fd774cb..ee8025b  git-annex           -> origin/git-annex
   0758cf9..6e91185  master              -> origin/master
   0758cf9..6e91185  synced/master       -> origin/synced/master
ok
push origin
Counting objects: 1, done.
Writing objects: 100% (1/1), 185 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To A:/a
   fd774cb..ee8025b  git-annex -> synced/git-annex
   6e91185..a886805  annex/direct/master -> synced/master
ok

$ # script done here
$ cd b
$ git annex whereis
whereis folder1/1.txt (1 copy)
        2a9ef292-1729-4533-ac50-f68d2d0badb6 -- second [here]
ok

$ cat folder1/1.txt
../.git/annex/objects/W5/55/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c.txt/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c.txt

$ git annex get
get folder1/1.txt (not available)
  No other repository is known to contain the file.
failed
git-annex: get: 1 failed


# End of transcript or log.

Conclusion

I'm so attracted to git-annex's idea, but so sad it's still not robust enough to use on Windows platform - v5 direct mode repo is as far as I can get, yet it still throws away my data like this...