diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-01-10 15:24:25 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-01-10 15:24:25 -0800 |
commit | 979b82f19f3c44d34779c46c636aade514a711a9 (patch) | |
tree | 2c2114cd025534e0af030be907cdb129e3269623 /Documentation/git-gc.txt | |
parent | Merge branch 'mm/push-social-engineering-attack-doc' (diff) | |
parent | git-gc.txt: expand discussion of races with other processes (diff) | |
download | tgif-979b82f19f3c44d34779c46c636aade514a711a9.tar.xz |
Merge branch 'mm/gc-safety-doc'
Doc update.
* mm/gc-safety-doc:
git-gc.txt: expand discussion of races with other processes
Diffstat (limited to 'Documentation/git-gc.txt')
-rw-r--r-- | Documentation/git-gc.txt | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt index bed60f471c..852b72c679 100644 --- a/Documentation/git-gc.txt +++ b/Documentation/git-gc.txt @@ -63,11 +63,10 @@ automatic consolidation of packs. --prune=<date>:: Prune loose objects older than date (default is 2 weeks ago, overridable by the config variable `gc.pruneExpire`). - --prune=all prunes loose objects regardless of their age (do - not use --prune=all unless you know exactly what you are doing. - Unless the repository is quiescent, you will lose newly created - objects that haven't been anchored with the refs and end up - corrupting your repository). --prune is on by default. + --prune=all prunes loose objects regardless of their age and + increases the risk of corruption if another process is writing to + the repository concurrently; see "NOTES" below. --prune is on by + default. --no-prune:: Do not prune any loose objects. @@ -138,17 +137,36 @@ default is "2 weeks ago". Notes ----- -'git gc' tries very hard to be safe about the garbage it collects. In +'git gc' tries very hard not to delete objects that are referenced +anywhere in your repository. In particular, it will keep not only objects referenced by your current set of branches and tags, but also objects referenced by the index, remote-tracking branches, refs saved by 'git filter-branch' in refs/original/, or reflogs (which may reference commits in branches that were later amended or rewound). - -If you are expecting some objects to be collected and they aren't, check +If you are expecting some objects to be deleted and they aren't, check all of those locations and decide whether it makes sense in your case to remove those references. +On the other hand, when 'git gc' runs concurrently with another process, +there is a risk of it deleting an object that the other process is using +but hasn't created a reference to. This may just cause the other process +to fail or may corrupt the repository if the other process later adds a +reference to the deleted object. Git has two features that significantly +mitigate this problem: + +. Any object with modification time newer than the `--prune` date is kept, + along with everything reachable from it. + +. Most operations that add an object to the database update the + modification time of the object if it is already present so that #1 + applies. + +However, these features fall short of a complete solution, so users who +run commands concurrently have to live with some risk of corruption (which +seems to be low in practice) unless they turn off automatic garbage +collection with 'git config gc.auto 0'. + HOOKS ----- |