diff --git a/project.py b/project.py index d551351b..a7001b01 100755 --- a/project.py +++ b/project.py @@ -1310,6 +1310,16 @@ class Project(object): submodules=submodules)): return False + mp = self.manifest.manifestProject + dissociate = mp.config.GetBoolean('repo.dissociate') + if dissociate: + alternates_file = os.path.join(self.gitdir, 'objects/info/alternates') + if os.path.exists(alternates_file): + cmd = ['repack', '-a', '-d'] + if GitCommand(self, cmd, bare=True).Wait() != 0: + return False + platform_utils.remove(alternates_file) + if self.worktree: self._InitMRef() else: diff --git a/repo b/repo index 6d3e8c2f..998731c6 100755 --- a/repo +++ b/repo @@ -190,6 +190,9 @@ group.add_option('--mirror', group.add_option('--reference', dest='reference', help='location of mirror directory', metavar='DIR') +group.add_option('--dissociate', + dest='dissociate', action='store_true', + help='dissociate from reference mirrors after clone') group.add_option('--depth', type='int', default=None, dest='depth', help='create a shallow clone with given depth; see git clone') diff --git a/subcmds/init.py b/subcmds/init.py index 4e51dfe8..6e99658f 100644 --- a/subcmds/init.py +++ b/subcmds/init.py @@ -61,6 +61,11 @@ directory use as much data as possible from the local reference directory when fetching from the server. This will make the sync go a lot faster by reducing data traffic on the network. +The --dissociate option can be used to borrow the objects from +the directory specified with the --reference option only to reduce +network transfer, and stop borrowing from them after a first clone +is made by making necessary local copies of borrowed objects. + The --no-clone-bundle option disables any attempt to use $URL/clone.bundle to bootstrap a new Git repository from a resumeable bundle file on a content delivery network. This @@ -103,6 +108,9 @@ to update the working directory files. g.add_option('--reference', dest='reference', help='location of mirror directory', metavar='DIR') + g.add_option('--dissociate', + dest='dissociate', action='store_true', + help='dissociate from reference mirrors after clone') g.add_option('--depth', type='int', default=None, dest='depth', help='create a shallow clone with given depth; see git clone') @@ -219,6 +227,9 @@ to update the working directory files. if opt.reference: m.config.SetString('repo.reference', opt.reference) + if opt.dissociate: + m.config.SetString('repo.dissociate', 'true') + if opt.archive: if is_new: m.config.SetString('repo.archive', 'true')