Create local refs to prevent pruning

By default git will prune dangling commits more than 2 weeks old. All
the unmerged versions of reviews pushed up more than 2 weeks ago count
as such commits, so we're downloading all the history again and again
each time git-gc --auto ends up being invoked (which is triggered
amongst other things by loose object counts. This leads to random
stalls in gertty when it has to redownload those objects - and this
is obviously worse when offline.

This commit adds refs to prevent this behaviour, but doesn't remove
them at any point. We probably want to facilitate gc of
merged/abandoned/ignored commits at some point. I'm not sure if that
needs to happen in this commit or if it could be added later.

Change-Id: I01c61fd65207fe0dc99208241eefd5d6432c2ad0
This commit is contained in:
Robert Collins 2014-07-04 19:13:27 +12:00 committed by James E. Blair
parent 7f0ebb25bd
commit 071c79f6fb
2 changed files with 10 additions and 7 deletions

View File

@ -255,7 +255,7 @@ class SyncChangeTask(Task):
sync.app.config.password, url[1])
url = urlparse.urlunsplit(url)
if (not revision) or self.force_fetch:
fetches[url].append(ref)
fetches[url].append('+%(ref)s:%(ref)s' % dict(ref=ref))
if not revision:
revision = change.createRevision(remote_revision['_number'],
remote_revision['commit']['message'], remote_commit,
@ -435,7 +435,7 @@ class FetchRefTask(Task):
url = urlparse.urlunsplit(url)
self.log.debug("git fetch %s %s" % (url, self.refs))
repo = sync.app.getRepo(self.project_name)
refs = self.refs
refs = ['+%(ref)s:%(ref)s' % dict(ref=ref) for ref in self.refs]
try:
repo.fetch(url, refs)
except Exception:

View File

@ -359,7 +359,7 @@ This Screen
self.refresh()
def checkGitRepo(self):
missing_revisions = False
missing_revisions = set()
change_number = None
change_id = None
with self.app.db.getSession() as session:
@ -368,12 +368,15 @@ This Screen
change_id = change.id
repo = self.app.getRepo(change.project.name)
for revision in change.revisions:
if not (repo.hasCommit(revision.parent) and
repo.hasCommit(revision.commit)):
missing_revisions = True
if not repo.hasCommit(revision.parent):
missing_revisions.add(revision.parent)
if not repo.hasCommit(revision.commit):
missing_revisions.add(revision.commit)
if missing_revisions:
break
if missing_revisions:
self.app.log.warning("Missing some commits for change %s" % change_number)
self.app.log.warning("Missing some commits for change %s %s",
change_number, missing_revisions)
task = sync.SyncChangeTask(change_id, force_fetch=True,
priority=sync.HIGH_PRIORITY)
self.app.sync.submitTask(task)