Please describe the problem.
Direct mode repositories seem to initially ignore hard linked files and then when changes are done to them sync them as separate files. However, changes to one file are only propagated to that file and not to any of the others that are hardlinked to it.
What steps will reproduce the problem?
Inside a direct mode repository linked to a ssh remote:
$ ls -l total 0 $ echo "something" > foo $ ln foo bar $ ls -l total 8 -rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 bar -rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 foo $ tail .git/annex/daemon.log 6c0fbd7..0bb8ef9 git-annex -> synced/git-annex 0bae1b4..bfedc45 master -> synced/master sent 77 bytes received 31 bytes 72.00 bytes/sec total size is 10 speedup is 0.09 [2013-05-29 12:08:03 WEST] Transferrer: Uploaded foo Already up-to-date. [2013-05-29 12:08:05 WEST] Pusher: Syncing with golias To ssh://golias.git-annex/home/pedrocr/testsync 0bb8ef9..2ce5013 git-annex -> synced/git-annex $ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # typechange: foo # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # bar no changes added to commit (use "git add" and/or "git commit -a")
On the remote repository:
$ ls -l total 4 -rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo
If I now just touch the linked file on the repository:
$ touch bar $ tail .git/annex/daemon.log (merging synced/git-annex into git-annex...) (Recording state in git...) add bar (checksum...) [2013-05-29 12:12:49 WEST] Committer: Committing changes to git [2013-05-29 12:12:49 WEST] Pusher: Syncing with golias Already up-to-date. To ssh://golias.git-annex/home/pedrocr/testsync 2ce5013..d36166b git-annex -> synced/git-annex bfedc45..ee3a7a1 master -> synced/master Already up-to-date.
On the remote repository:
$ ls -l total 8 -rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 bar -rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo
Note that now bar has been synced as a new file and not a hardlink as it should be (the 1's after the permissions).
The sync also isn't acting properly on the linked files. For example.
First in the origin repository:
$ cat bar something $ cat foo something $ echo "someotherthing" > bar $ cat bar someotherthing $ cat foo someotherthing
The result in the destination:
$ cat bar someotherthing $ cat foo something
So even if the intended behavior is for hardlinked files to be synced as two separate files the sync isn't correct because the two files changed in the origin and only one of them changed in the destination. This probably needs to be fixed with actual hard links for real filesystems and with some copying for crippled filesystems.
What version of git-annex are you using? On what operating system?
$ git annex version git-annex version: 4.20130516.1 build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP local repository version: 4 default repository version: 3 supported repository versions: 3 4 upgrade supported from repository versions: 0 1 2 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 12.04.2 LTS Release: 12.04 Codename: precise