aboutsummaryrefslogtreecommitdiff
path: root/doc/tips/assume-unstaged.mdwn
blob: 63f5f820a50763e8b40cc8fee630c0238198aca5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[[!meta title="using assume-unstages to speed up git with large trees of annexed files"]]

Git update-index's assume-unstaged feature can be used to speed
up `git status` and stuff by not statting the whole tree looking for changed
files.

This feature works quite well with git-annex. Especially because git
annex's files are immutable, so aren't going to change out from under it,
this is a nice fit. If you have a very large tree and `git status` is
annoyingly slow, you can turn it on:

	git config core.ignoreStat true

When `git mv` and `git rm` are used, those changes *do* get noticed, even
on assume-unchanged files. When new files are added, eg by `git annex add`,
they are also noticed.

There are two gotchas. Both occur because `git add` does not stage
assume-unchanged files.

1. When an annexed file is moved to a different directory, it updates
   the symlink, and runs `git add` on it. So the file will move,
   but the changed symlink will not be noticed by git and it will commit a
   dangling symlink.
2. When using `git annex migrate`, it changes the symlink and `git adds`
   it. Again this won't be committed.

These can be worked around by running `git update-index --really-refresh`
after performing such operations. I hope that `git add` will be changed
to stage changes to assume-unchanged files, which would remove this
only complication. --[[Joey]]