78 lines
3.1 KiB
Markdown
78 lines
3.1 KiB
Markdown
Normally, git-annex repositories consist of symlinks that are checked into
|
|
git, and in turn point at the content of large files that is stored in
|
|
`.git/annex/objects/`. Direct mode is an experimental mode that gets rid of
|
|
the symlinks.
|
|
|
|
The advantage of direct mode is that you can access files directly,
|
|
including modifying them. The disadvantage is that most regular git
|
|
commands cannot safely be used, and only a subset of git-annex commands
|
|
can be used.
|
|
|
|
## enabling (and disabling) direct mode
|
|
|
|
Any repository can be converted to use direct mode at any time, and if you
|
|
decide not to use it, you can convert back to indirect mode just as easily.
|
|
Also, you can have one clone of a repository using direct mode, and another
|
|
using indirect mode; direct mode interoperates.
|
|
|
|
To start using direct mode:
|
|
|
|
git annex direct
|
|
|
|
To stop using direct mode:
|
|
|
|
git annex indirect
|
|
|
|
With direct mode, you're operating without large swathes of git-annex's
|
|
carefully constructed safety net. So you're strongly encouraged to tell
|
|
git-annex that your direct mode repository cannot be trusted to retain
|
|
the content of a file (because any file can be deleted or modified at
|
|
any time). To do so:
|
|
|
|
git annex untrust .
|
|
|
|
## use a direct mode repository
|
|
|
|
Perhaps the best way to use a direct mode repository is with the git-annex
|
|
assistant.
|
|
|
|
Otherwise, the main command that's used in direct mode repositories is
|
|
`git annex sync`. This automatically adds new files, commits all
|
|
changed files to git, pushes them out, pulls down any changes, etc.
|
|
|
|
You can also run `git annex get` to transfer the content of files into your
|
|
direct mode repository. Or if the direct mode repository is a remote of
|
|
some other, regular git-annex repository, you can use commands like `git
|
|
annex copy` and `git annex move` to transfer the contents of files to the
|
|
direct mode repository.
|
|
|
|
You can use `git commit --staged`. (But not `git commit -a` .. It'll commit
|
|
whole large files into git!)
|
|
|
|
You can use `git log` and other git query commands.
|
|
|
|
## what doesn't work in direct mode
|
|
|
|
Don't use `git annex add` -- it thinks all direct mode files are unlocked,
|
|
and locks them.
|
|
|
|
In general git-annex commands will only work in direct mode repositories on
|
|
files whose content is not present. That's because such files are still
|
|
represented as symlinks, which git-annex commands know how to operate on.
|
|
So, `git annex get` works, but `git annex drop` and `git annex move` don't,
|
|
and things like `git annex fsck` and `git annex status` show incomplete
|
|
information.
|
|
|
|
It's technically possible to make all git-annex commands work in direct
|
|
mode repositories, so this might change. Check back to this page to see
|
|
current status about what works and what doesn't.
|
|
|
|
As for git commands, you can probably use some git working tree
|
|
manipulation commands, like `git checkout` and `git revert` in useful
|
|
ways... But beware, these commands can replace files that are present in
|
|
your repository with broken symlinks. If that file was the only copy you
|
|
had of something, it'll be lost.
|
|
|
|
This is one reason it's wise to make git-annex untrust your direct mode
|
|
repositories. Still, you can lose data using these sort of git commands, so
|
|
use extreme caution.
|