Index: gclient_scm.py |
diff --git a/gclient_scm.py b/gclient_scm.py |
index a87032e749902122c676b6621dde4fec33f8f232..d457a5c5a5fc8b7f6450656d0a5ce45fcc1192ed 100644 |
--- a/gclient_scm.py |
+++ b/gclient_scm.py |
@@ -825,6 +825,25 @@ class GitWrapper(SCMWrapper): |
# create it, so we need to do it manually. |
parent_dir = os.path.dirname(self.checkout_path) |
gclient_utils.safe_makedirs(parent_dir) |
+ |
+ template_dir = None |
+ if hasattr(options, 'no_history') and options.no_history: |
+ if gclient_utils.IsGitSha(revision): |
+ # In the case of a subproject, the pinned sha is not necessarily the |
+ # head of the remote branch (so we can't just use --depth=N). Instead, |
+ # we tell git to fetch all the remote objects from SHA..HEAD by means of |
+ # a template git dir which has a 'shallow' file pointing to the sha. |
+ template_dir = tempfile.mkdtemp( |
+ prefix='_gclient_gittmp_%s' % os.path.basename(self.checkout_path), |
+ dir=parent_dir) |
+ self._Run(['init', '--bare', template_dir], options, cwd=self._root_dir) |
+ with open(os.path.join(template_dir, 'shallow'), 'w') as template_file: |
+ template_file.write(revision) |
+ clone_cmd.append('--template=' + template_dir) |
+ else: |
+ # Otherwise, we're just interested in the HEAD. Just use --depth. |
+ clone_cmd.append('--depth=1') |
+ |
tmp_dir = tempfile.mkdtemp( |
prefix='_gclient_%s_' % os.path.basename(self.checkout_path), |
dir=parent_dir) |
@@ -841,6 +860,8 @@ class GitWrapper(SCMWrapper): |
if os.listdir(tmp_dir): |
self.Print('_____ removing non-empty tmp dir %s' % tmp_dir) |
gclient_utils.rmtree(tmp_dir) |
+ if template_dir: |
+ gclient_utils.rmtree(template_dir) |
self._UpdateBranchHeads(options, fetch=True) |
self._Checkout(options, revision.replace('refs/heads/', ''), quiet=True) |
if self._GetCurrentBranch() is None: |