15168
|
1 |
# Copyright 2009-2010 Gregory P. Ward
|
|
2 |
# Copyright 2009-2010 Intelerad Medical Systems Incorporated
|
|
3 |
# Copyright 2010-2011 Fog Creek Software
|
|
4 |
# Copyright 2010-2011 Unity Technologies
|
|
5 |
#
|
|
6 |
# This software may be used and distributed according to the terms of the
|
|
7 |
# GNU General Public License version 2 or any later version.
|
|
8 |
|
|
9 |
'''track large binary files
|
|
10 |
|
15230
|
11 |
Large binary files tend to be not very compressible, not very
|
|
12 |
diffable, and not at all mergeable. Such files are not handled
|
|
13 |
efficiently by Mercurial's storage format (revlog), which is based on
|
|
14 |
compressed binary deltas; storing large binary files as regular
|
|
15 |
Mercurial files wastes bandwidth and disk space and increases
|
|
16 |
Mercurial's memory usage. The largefiles extension addresses these
|
|
17 |
problems by adding a centralized client-server layer on top of
|
|
18 |
Mercurial: largefiles live in a *central store* out on the network
|
|
19 |
somewhere, and you only fetch the revisions that you need when you
|
|
20 |
need them.
|
|
21 |
|
|
22 |
largefiles works by maintaining a "standin file" in .hglf/ for each
|
|
23 |
largefile. The standins are small (41 bytes: an SHA-1 hash plus
|
|
24 |
newline) and are tracked by Mercurial. Largefile revisions are
|
|
25 |
identified by the SHA-1 hash of their contents, which is written to
|
|
26 |
the standin. largefiles uses that revision ID to get/put largefile
|
|
27 |
revisions from/to the central store. This saves both disk space and
|
|
28 |
bandwidth, since you don't need to retrieve all historical revisions
|
|
29 |
of large files when you clone or pull.
|
|
30 |
|
|
31 |
To start a new repository or add new large binary files, just add
|
|
32 |
--large to your ``hg add`` command. For example::
|
|
33 |
|
|
34 |
$ dd if=/dev/urandom of=randomdata count=2000
|
|
35 |
$ hg add --large randomdata
|
|
36 |
$ hg commit -m 'add randomdata as a largefile'
|
|
37 |
|
|
38 |
When you push a changeset that adds/modifies largefiles to a remote
|
|
39 |
repository, its largefile revisions will be uploaded along with it.
|
|
40 |
Note that the remote Mercurial must also have the largefiles extension
|
|
41 |
enabled for this to work.
|
15168
|
42 |
|
15230
|
43 |
When you pull a changeset that affects largefiles from a remote
|
|
44 |
repository, Mercurial behaves as normal. However, when you update to
|
|
45 |
such a revision, any largefiles needed by that revision are downloaded
|
|
46 |
and cached (if they have never been downloaded before). This means
|
|
47 |
that network access may be required to update to changesets you have
|
|
48 |
not previously updated to.
|
|
49 |
|
|
50 |
If you already have large files tracked by Mercurial without the
|
|
51 |
largefiles extension, you will need to convert your repository in
|
|
52 |
order to benefit from largefiles. This is done with the 'hg lfconvert'
|
|
53 |
command::
|
|
54 |
|
|
55 |
$ hg lfconvert --size 10 oldrepo newrepo
|
15168
|
56 |
|
15230
|
57 |
In repositories that already have largefiles in them, any new file
|
|
58 |
over 10MB will automatically be added as a largefile. To change this
|
|
59 |
threshhold, set ``largefiles.size`` in your Mercurial config file to
|
|
60 |
the minimum size in megabytes to track as a largefile, or use the
|
|
61 |
--lfsize option to the add command (also in megabytes)::
|
|
62 |
|
|
63 |
[largefiles]
|
|
64 |
size = 2 XXX wouldn't minsize be a better name?
|
|
65 |
|
|
66 |
$ hg add --lfsize 2
|
|
67 |
|
|
68 |
The ``largefiles.patterns`` config option allows you to specify a list
|
|
69 |
of filename patterns (see ``hg help patterns``) that should always be
|
|
70 |
tracked as largefiles::
|
|
71 |
|
|
72 |
[largefiles]
|
|
73 |
patterns =
|
|
74 |
*.jpg
|
|
75 |
re:.*\.(png|bmp)$
|
|
76 |
library.zip
|
|
77 |
content/audio/*
|
|
78 |
|
|
79 |
Files that match one of these patterns will be added as largefiles
|
|
80 |
regardless of their size.
|
15168
|
81 |
'''
|
|
82 |
|
|
83 |
from mercurial import commands
|
|
84 |
|
|
85 |
import lfcommands
|
|
86 |
import reposetup
|
|
87 |
import uisetup
|
|
88 |
|
|
89 |
reposetup = reposetup.reposetup
|
|
90 |
uisetup = uisetup.uisetup
|
|
91 |
|
|
92 |
commands.norepo += " lfconvert"
|
|
93 |
|
|
94 |
cmdtable = lfcommands.cmdtable
|