code: def _update_repo(repo_config, store, tags_only):
      
      repo_path = store.clone(repo_config['repo'], repo_config['rev'])
  
      cmd_output('git', 'fetch', cwd=repo_path)
      tag_cmd = ('git', 'describe', 'origin/master', '--tags')
      if tags_only:
          tag_cmd += ('--abbrev=0',)
      else:
          tag_cmd += ('--exact',)
      try:
          rev = cmd_output(*tag_cmd, cwd=repo_path)[1].strip()
      except CalledProcessError:
          tag_cmd = ('git', 'rev-parse', 'origin/master')
          rev = cmd_output(*tag_cmd, cwd=repo_path)[1].strip()
  
      # Don't bother trying to update if our rev is the same
      if rev == repo_config['rev']:
          return repo_config
  
      try:
          path = store.clone(repo_config['repo'], rev)
          manifest = load_manifest(os.path.join(path, C.MANIFEST_FILE))
      except InvalidManifestError as e:
          raise RepositoryCannotBeUpdatedError(six.text_type(e))
  
      # See if any of our hooks were deleted with the new commits
      hooks = {hook['id'] for hook in repo_config['hooks']}
      hooks_missing = hooks - {hook['id'] for hook in manifest}
      if hooks_missing:
          raise RepositoryCannotBeUpdatedError(
              'Cannot update because the tip of master is missing these hooks:\n'
              '{}'.format(', '.join(sorted(hooks_missing))),
          )
  
      # Construct a new config with the head rev
      new_config = repo_config.copy()
      new_config['rev'] = rev
      return new_config
docs: Updates a repository to the tip of `master`.  If the repository cannot
      be updated because a hook that is configured does not exist in `master`,
      this raises a RepositoryCannotBeUpdatedError
  
      Args:
          repo_config - A config for a repository