diff --git a/git_command.py b/git_command.py
index 56e18e0..19100fa 100644
--- a/git_command.py
+++ b/git_command.py
@@ -230,11 +230,12 @@
     stderr = (subprocess.STDOUT if merge_output else
               (subprocess.PIPE if capture_stderr else None))
 
-    dbg = ''
     if IsTrace():
       global LAST_CWD
       global LAST_GITDIR
 
+      dbg = ''
+
       if cwd and LAST_CWD != cwd:
         if LAST_GITDIR or LAST_CWD:
           dbg += '\n'
@@ -262,31 +263,31 @@
         dbg += ' 2>|'
       elif stderr == subprocess.STDOUT:
         dbg += ' 2>&1'
+      Trace('%s', dbg)
 
-    with Trace('git command %s %s with debug: %s', LAST_GITDIR, command, dbg):
-      try:
-        p = subprocess.Popen(command,
-                            cwd=cwd,
-                            env=env,
-                            encoding='utf-8',
-                            errors='backslashreplace',
-                            stdin=stdin,
-                            stdout=stdout,
-                            stderr=stderr)
-      except Exception as e:
-        raise GitError('%s: %s' % (command[1], e))
+    try:
+      p = subprocess.Popen(command,
+                           cwd=cwd,
+                           env=env,
+                           encoding='utf-8',
+                           errors='backslashreplace',
+                           stdin=stdin,
+                           stdout=stdout,
+                           stderr=stderr)
+    except Exception as e:
+      raise GitError('%s: %s' % (command[1], e))
 
+    if ssh_proxy:
+      ssh_proxy.add_client(p)
+
+    self.process = p
+
+    try:
+      self.stdout, self.stderr = p.communicate(input=input)
+    finally:
       if ssh_proxy:
-        ssh_proxy.add_client(p)
-
-      self.process = p
-
-      try:
-        self.stdout, self.stderr = p.communicate(input=input)
-      finally:
-        if ssh_proxy:
-          ssh_proxy.remove_client(p)
-      self.rc = p.wait()
+        ssh_proxy.remove_client(p)
+    self.rc = p.wait()
 
   @staticmethod
   def _GetBasicEnv():
diff --git a/git_config.py b/git_config.py
index 94378e9..6f80ae0 100644
--- a/git_config.py
+++ b/git_config.py
@@ -219,8 +219,8 @@
     """Set the value(s) for a key.
        Only this configuration file is modified.
 
-       The supplied value should be either a string, or a list of strings (to
-       store multiple values), or None (to delete the key).
+       The supplied value should be either a string,
+       or a list of strings (to store multiple values).
     """
     key = _key(name)
 
@@ -349,9 +349,9 @@
     except OSError:
       return None
     try:
-      with Trace(': parsing %s', self.file):
-        with open(self._json) as fd:
-          return json.load(fd)
+      Trace(': parsing %s', self.file)
+      with open(self._json) as fd:
+        return json.load(fd)
     except (IOError, ValueError):
       platform_utils.remove(self._json, missing_ok=True)
       return None
diff --git a/git_refs.py b/git_refs.py
index 300d2b3..2d4a809 100644
--- a/git_refs.py
+++ b/git_refs.py
@@ -67,37 +67,38 @@
       self._LoadAll()
 
   def _NeedUpdate(self):
-    with Trace(': scan refs %s', self._gitdir):
-      for name, mtime in self._mtime.items():
-        try:
-          if mtime != os.path.getmtime(os.path.join(self._gitdir, name)):
-            return True
-        except OSError:
+    Trace(': scan refs %s', self._gitdir)
+
+    for name, mtime in self._mtime.items():
+      try:
+        if mtime != os.path.getmtime(os.path.join(self._gitdir, name)):
           return True
-      return False
+      except OSError:
+        return True
+    return False
 
   def _LoadAll(self):
-    with Trace(': load refs %s', self._gitdir):
+    Trace(': load refs %s', self._gitdir)
 
-      self._phyref = {}
-      self._symref = {}
-      self._mtime = {}
+    self._phyref = {}
+    self._symref = {}
+    self._mtime = {}
 
-      self._ReadPackedRefs()
-      self._ReadLoose('refs/')
-      self._ReadLoose1(os.path.join(self._gitdir, HEAD), HEAD)
+    self._ReadPackedRefs()
+    self._ReadLoose('refs/')
+    self._ReadLoose1(os.path.join(self._gitdir, HEAD), HEAD)
 
-      scan = self._symref
-      attempts = 0
-      while scan and attempts < 5:
-        scan_next = {}
-        for name, dest in scan.items():
-          if dest in self._phyref:
-            self._phyref[name] = self._phyref[dest]
-          else:
-            scan_next[name] = dest
-        scan = scan_next
-        attempts += 1
+    scan = self._symref
+    attempts = 0
+    while scan and attempts < 5:
+      scan_next = {}
+      for name, dest in scan.items():
+        if dest in self._phyref:
+          self._phyref[name] = self._phyref[dest]
+        else:
+          scan_next[name] = dest
+      scan = scan_next
+      attempts += 1
 
   def _ReadPackedRefs(self):
     path = os.path.join(self._gitdir, 'packed-refs')
diff --git a/main.py b/main.py
index e629b30..c54f928 100755
--- a/main.py
+++ b/main.py
@@ -37,7 +37,7 @@
 
 from color import SetDefaultColoring
 import event_log
-from repo_trace import SetTrace, Trace, SetTraceToStderr
+from repo_trace import SetTrace
 from git_command import user_agent
 from git_config import RepoConfig
 from git_trace2_event_log import EventLog
@@ -109,9 +109,6 @@
 global_options.add_option('--trace',
                           dest='trace', action='store_true',
                           help='trace git command execution (REPO_TRACE=1)')
-global_options.add_option('--trace_to_stderr',
-                          dest='trace_to_stderr', action='store_true',
-                          help='trace outputs go to stderr in addition to .repo/TRACE_FILE')
 global_options.add_option('--trace-python',
                           dest='trace_python', action='store_true',
                           help='trace python command execution')
@@ -201,6 +198,9 @@
     """Execute the requested subcommand."""
     result = 0
 
+    if gopts.trace:
+      SetTrace()
+
     # Handle options that terminate quickly first.
     if gopts.help or gopts.help_all:
       self._PrintHelp(short=False, all_commands=gopts.help_all)
@@ -652,26 +652,17 @@
   Version.wrapper_path = opt.wrapper_path
 
   repo = _Repo(opt.repodir)
-
   try:
     init_http()
     name, gopts, argv = repo._ParseArgs(argv)
-
-    if gopts.trace:
-      SetTrace()
-
-    if gopts.trace_to_stderr:
-      SetTraceToStderr()
-
-    with Trace('starting new command: %s', ', '.join([name] + argv), first_trace=True):
-      run = lambda: repo._Run(name, gopts, argv) or 0
-      if gopts.trace_python:
-        import trace
-        tracer = trace.Trace(count=False, trace=True, timing=True,
-                             ignoredirs=set(sys.path[1:]))
-        result = tracer.runfunc(run)
-      else:
-        result = run()
+    run = lambda: repo._Run(name, gopts, argv) or 0
+    if gopts.trace_python:
+      import trace
+      tracer = trace.Trace(count=False, trace=True, timing=True,
+                           ignoredirs=set(sys.path[1:]))
+      result = tracer.runfunc(run)
+    else:
+      result = run()
   except KeyboardInterrupt:
     print('aborted by user', file=sys.stderr)
     result = 1
diff --git a/project.py b/project.py
index 9d7476b..1c85b04 100644
--- a/project.py
+++ b/project.py
@@ -41,7 +41,7 @@
 from error import NoManifestException, ManifestParseError
 import platform_utils
 import progress
-from repo_trace import Trace
+from repo_trace import IsTrace, Trace
 
 from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB, R_M, R_WORKTREE_M
 
@@ -59,7 +59,7 @@
 # +-10% random jitter is added to each Fetches retry sleep duration.
 RETRY_JITTER_PERCENT = 0.1
 
-# Whether to use alternates.  Switching back and forth is *NOT* supported.
+# Whether to use alternates.
 # TODO(vapier): Remove knob once behavior is verified.
 _ALTERNATES = os.environ.get('REPO_USE_ALTERNATES') == '1'
 
@@ -2416,16 +2416,16 @@
         srcUrl = 'http' + srcUrl[len('persistent-http'):]
       cmd += [srcUrl]
 
-      proc = None
-      with Trace('Fetching bundle: %s', ' '.join(cmd)):
-        if verbose:
-          print('%s: Downloading bundle: %s' % (self.name, srcUrl))
-        stdout = None if verbose else subprocess.PIPE
-        stderr = None if verbose else subprocess.STDOUT
-        try:
-          proc = subprocess.Popen(cmd, stdout=stdout, stderr=stderr)
-        except OSError:
-          return False
+      if IsTrace():
+        Trace('%s', ' '.join(cmd))
+      if verbose:
+        print('%s: Downloading bundle: %s' % (self.name, srcUrl))
+      stdout = None if verbose else subprocess.PIPE
+      stderr = None if verbose else subprocess.STDOUT
+      try:
+        proc = subprocess.Popen(cmd, stdout=stdout, stderr=stderr)
+      except OSError:
+        return False
 
       (output, _) = proc.communicate()
       curlret = proc.returncode
diff --git a/repo_trace.py b/repo_trace.py
index 0ff3b69..7be0c04 100644
--- a/repo_trace.py
+++ b/repo_trace.py
@@ -15,128 +15,26 @@
 """Logic for tracing repo interactions.
 
 Activated via `repo --trace ...` or `REPO_TRACE=1 repo ...`.
-
-Temporary: Tracing is always on. Set `REPO_TRACE=0` to turn off.
-To also include trace outputs in stderr do `repo --trace_to_stderr ...`
 """
 
 import sys
 import os
-import tempfile
-import time
-from contextlib import ContextDecorator
 
 # Env var to implicitly turn on tracing.
 REPO_TRACE = 'REPO_TRACE'
 
-# Temporarily set tracing to always on unless user expicitly sets to 0.
-_TRACE = os.environ.get(REPO_TRACE) != '0'
-
-_TRACE_TO_STDERR = False
-
-_TRACE_FILE = None
-
-_TRACE_FILE_NAME = 'TRACE_FILE'
-
-_MAX_SIZE = 5  # in mb
-
-_NEW_COMMAND_SEP = '+++++++++++++++NEW COMMAND+++++++++++++++++++'
-
-
-def IsStraceToStderr():
-  return _TRACE_TO_STDERR
+_TRACE = os.environ.get(REPO_TRACE) == '1'
 
 
 def IsTrace():
   return _TRACE
 
 
-def SetTraceToStderr():
-  global _TRACE_TO_STDERR
-  _TRACE_TO_STDERR = True
-
-
 def SetTrace():
   global _TRACE
   _TRACE = True
 
 
-def _SetTraceFile():
-  global _TRACE_FILE
-  _TRACE_FILE = _GetTraceFile()
-
-
-class Trace(ContextDecorator):
-
-    def _time(self):
-      """Generate nanoseconds of time in a py3.6 safe way"""
-      return int(time.time()*1e+9)
-
-    def __init__(self, fmt, *args, first_trace=False):
-      if not IsTrace():
-        return
-      self._trace_msg = fmt % args
-
-      if not _TRACE_FILE:
-        _SetTraceFile()
-
-      if first_trace:
-        _ClearOldTraces()
-        self._trace_msg = '%s %s' % (_NEW_COMMAND_SEP, self._trace_msg)
-
-
-    def __enter__(self):
-      if not IsTrace():
-        return self
-
-      print_msg = f"PID: {os.getpid()} START: {self._time()} :" + self._trace_msg + '\n'
-
-      with open(_TRACE_FILE, 'a') as f:
-        print(print_msg, file=f)
-
-      if _TRACE_TO_STDERR:
-        print(print_msg, file=sys.stderr)
-
-      return self
-
-    def __exit__(self, *exc):
-      if not IsTrace():
-        return False
-
-      print_msg = f"PID: {os.getpid()} END: {self._time()} :" + self._trace_msg + '\n'
-
-      with open(_TRACE_FILE, 'a') as f:
-        print(print_msg, file=f)
-
-      if _TRACE_TO_STDERR:
-        print(print_msg, file=sys.stderr)
-
-      return False
-
-
-def _GetTraceFile():
-  """Get the trace file or create one."""
-  # TODO: refactor to pass repodir to Trace.
-  repo_dir = os.path.dirname(os.path.dirname(__file__))
-  trace_file = os.path.join(repo_dir, _TRACE_FILE_NAME)
-  print('Trace outputs in %s' % trace_file)
-  return trace_file
-
-def _ClearOldTraces():
-  """Clear traces from old commands if trace file is too big.
-
-  Note: If the trace file contains output from two `repo`
-        commands that were running at the same time, this
-        will not work precisely.
-  """
-  if os.path.isfile(_TRACE_FILE):
-    while os.path.getsize(_TRACE_FILE)/(1024*1024) > _MAX_SIZE:
-      temp = tempfile.NamedTemporaryFile(mode='w', delete=False)
-      with open(_TRACE_FILE, 'r', errors='ignore') as fin:
-        trace_lines = fin.readlines()
-        for i , l in enumerate(trace_lines):
-          if 'END:' in l and _NEW_COMMAND_SEP in l:
-            temp.writelines(trace_lines[i+1:])
-            break
-      temp.close()
-      os.replace(temp.name, _TRACE_FILE)
+def Trace(fmt, *args):
+  if IsTrace():
+    print(fmt % args, file=sys.stderr)
diff --git a/run_tests b/run_tests
index 7c9ff41..573dd44 100755
--- a/run_tests
+++ b/run_tests
@@ -20,7 +20,6 @@
 import shutil
 import subprocess
 import sys
-import repo_trace
 
 
 def find_pytest():
diff --git a/ssh.py b/ssh.py
index 004fdba..450383d 100644
--- a/ssh.py
+++ b/ssh.py
@@ -182,29 +182,28 @@
     # be important because we can't tell that that 'git@myhost.com' is the same
     # as 'myhost.com' where "User git" is setup in the user's ~/.ssh/config file.
     check_command = command_base + ['-O', 'check']
-    with Trace('Call to ssh (check call): %s', ' '.join(check_command)):
-      try:
-        check_process = subprocess.Popen(check_command,
-                                        stdout=subprocess.PIPE,
-                                        stderr=subprocess.PIPE)
-        check_process.communicate()  # read output, but ignore it...
-        isnt_running = check_process.wait()
+    try:
+      Trace(': %s', ' '.join(check_command))
+      check_process = subprocess.Popen(check_command,
+                                       stdout=subprocess.PIPE,
+                                       stderr=subprocess.PIPE)
+      check_process.communicate()  # read output, but ignore it...
+      isnt_running = check_process.wait()
 
-        if not isnt_running:
-          # Our double-check found that the master _was_ infact running.  Add to
-          # the list of keys.
-          self._master_keys[key] = True
-          return True
-      except Exception:
-        # Ignore excpetions.  We we will fall back to the normal command and
-        # print to the log there.
-        pass
+      if not isnt_running:
+        # Our double-check found that the master _was_ infact running.  Add to
+        # the list of keys.
+        self._master_keys[key] = True
+        return True
+    except Exception:
+      # Ignore excpetions.  We we will fall back to the normal command and print
+      # to the log there.
+      pass
 
     command = command_base[:1] + ['-M', '-N'] + command_base[1:]
-    p = None
     try:
-      with Trace('Call to ssh: %s', ' '.join(command)):
-        p = subprocess.Popen(command)
+      Trace(': %s', ' '.join(command))
+      p = subprocess.Popen(command)
     except Exception as e:
       self._master_broken.value = True
       print('\nwarn: cannot enable ssh control master for %s:%s\n%s'
diff --git a/subcmds/gitc_init.py b/subcmds/gitc_init.py
index e3a5813..1d81baf 100644
--- a/subcmds/gitc_init.py
+++ b/subcmds/gitc_init.py
@@ -68,8 +68,7 @@
         sys.exit(1)
       manifest_file = opt.manifest_file
 
-    manifest = GitcManifest(self.repodir, os.path.join(self.client_dir,
-                                                       '.manifest'))
+    manifest = GitcManifest(self.repodir, gitc_client)
     manifest.Override(manifest_file)
     gitc_utils.generate_gitc_manifest(None, manifest)
     print('Please run `cd %s` to view your GITC client.' %
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 83c9ad3..fe63b48 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -60,7 +60,7 @@
 import platform_utils
 from project import SyncBuffer
 from progress import Progress
-from repo_trace import Trace
+from repo_trace import IsTrace, Trace
 import ssh
 from wrapper import Wrapper
 from manifest_xml import GitcManifest
@@ -739,6 +739,7 @@
     bak_dir = os.path.join(objdir, '.repo', 'pack.bak')
     if not _BACKUP_OBJECTS or not platform_utils.isdir(pack_dir):
       return
+    saved = []
     files = set(platform_utils.listdir(pack_dir))
     to_backup = []
     for f in files:
@@ -750,83 +751,12 @@
     for fname in to_backup:
       bak_fname = os.path.join(bak_dir, fname)
       if not os.path.exists(bak_fname):
-        with Trace('%s saved %s', bare_git._project.name, fname):
-          # Use a tmp file so that we are sure of a complete copy.
-          shutil.copy(os.path.join(pack_dir, fname), bak_fname + '.tmp')
-          shutil.move(bak_fname + '.tmp', bak_fname)
-
-  @staticmethod
-  def _GetPreciousObjectsState(project: Project, opt):
-    """Get the preciousObjects state for the project.
-
-    Args:
-      project (Project): the project to examine, and possibly correct.
-      opt (optparse.Values): options given to sync.
-
-    Returns:
-      Expected state of extensions.preciousObjects:
-        False: Should be disabled. (not present)
-        True: Should be enabled.
-    """
-    if project.use_git_worktrees:
-      return False
-    projects = project.manifest.GetProjectsWithName(project.name,
-                                                    all_manifests=True)
-    if len(projects) == 1:
-      return False
-    relpath = project.RelPath(local=opt.this_manifest_only)
-    if len(projects) > 1:
-      # Objects are potentially shared with another project.
-      # See the logic in Project.Sync_NetworkHalf regarding UseAlternates.
-      # - When False, shared projects share (via symlink)
-      #   .repo/project-objects/{PROJECT_NAME}.git as the one-and-only objects
-      #   directory.  All objects are precious, since there is no project with a
-      #   complete set of refs.
-      # - When True, shared projects share (via info/alternates)
-      #   .repo/project-objects/{PROJECT_NAME}.git as an alternate object store,
-      #   which is written only on the first clone of the project, and is not
-      #   written subsequently.  (When Sync_NetworkHalf sees that it exists, it
-      #   makes sure that the alternates file points there, and uses a
-      #   project-local .git/objects directory for all syncs going forward.
-      # We do not support switching between the options.  The environment
-      # variable is present for testing and migration only.
-      return not project.UseAlternates
-    print(f'\r{relpath}: project not found in manifest.', file=sys.stderr)
-    return False
-
-  def _RepairPreciousObjectsState(self, project: Project, opt):
-    """Correct the preciousObjects state for the project.
-
-    Args:
-      project (Project): the project to examine, and possibly correct.
-      opt (optparse.Values): options given to sync.
-    """
-    expected = self._GetPreciousObjectsState(project, opt)
-    actual = project.config.GetBoolean('extensions.preciousObjects') or False
-    relpath = project.RelPath(local = opt.this_manifest_only)
-
-    if (expected != actual and
-        not project.config.GetBoolean('repo.preservePreciousObjects')):
-      # If this is unexpected, log it and repair.
-      Trace(f'{relpath} expected preciousObjects={expected}, got {actual}')
-      if expected:
-        if not opt.quiet:
-          print('\r%s: Shared project %s found, disabling pruning.' %
-                (relpath, project.name))
-        if git_require((2, 7, 0)):
-          project.EnableRepositoryExtension('preciousObjects')
-        else:
-          # This isn't perfect, but it's the best we can do with old git.
-          print('\r%s: WARNING: shared projects are unreliable when using '
-                'old versions of git; please upgrade to git-2.7.0+.'
-                % (relpath,),
-                file=sys.stderr)
-          project.config.SetString('gc.pruneExpire', 'never')
-      else:
-        if not opt.quiet:
-          print(f'\r{relpath}: not shared, disabling pruning.')
-        project.config.SetString('extensions.preciousObjects', None)
-        project.config.SetString('gc.pruneExpire', None)
+        saved.append(fname)
+        # Use a tmp file so that we are sure of a complete copy.
+        shutil.copy(os.path.join(pack_dir, fname), bak_fname + '.tmp')
+        shutil.move(bak_fname + '.tmp', bak_fname)
+    if saved:
+      Trace('%s saved %s', bare_git._project.name, ' '.join(saved))
 
   def _GCProjects(self, projects, opt, err_event):
     pm = Progress('Garbage collecting', len(projects), delay=False, quiet=opt.quiet)
@@ -834,8 +764,27 @@
 
     tidy_dirs = {}
     for project in projects:
-      self._RepairPreciousObjectsState(project, opt)
-
+      # Make sure pruning never kicks in with shared projects that do not use
+      # alternates to avoid corruption.
+      if (not project.use_git_worktrees and
+              len(project.manifest.GetProjectsWithName(project.name, all_manifests=True)) > 1):
+        if project.UseAlternates:
+          # Undo logic set by previous versions of repo.
+          project.config.SetString('extensions.preciousObjects', None)
+          project.config.SetString('gc.pruneExpire', None)
+        else:
+          if not opt.quiet:
+            print('\r%s: Shared project %s found, disabling pruning.' %
+                  (project.relpath, project.name))
+          if git_require((2, 7, 0)):
+            project.EnableRepositoryExtension('preciousObjects')
+          else:
+            # This isn't perfect, but it's the best we can do with old git.
+            print('\r%s: WARNING: shared projects are unreliable when using old '
+                  'versions of git; please upgrade to git-2.7.0+.'
+                  % (project.relpath,),
+                  file=sys.stderr)
+            project.config.SetString('gc.pruneExpire', 'never')
       project.config.SetString('gc.autoDetach', 'false')
       # Only call git gc once per objdir, but call pack-refs for the remainder.
       if project.objdir not in tidy_dirs:
diff --git a/tests/test_git_config.py b/tests/test_git_config.py
index 0df3843..a4fad9e 100644
--- a/tests/test_git_config.py
+++ b/tests/test_git_config.py
@@ -19,7 +19,6 @@
 import unittest
 
 import git_config
-import repo_trace
 
 
 def fixture(*paths):
@@ -34,16 +33,9 @@
   def setUp(self):
     """Create a GitConfig object using the test.gitconfig fixture.
     """
-
-    self.tempdirobj = tempfile.TemporaryDirectory(prefix='repo_tests')
-    repo_trace._TRACE_FILE = os.path.join(self.tempdirobj.name, 'TRACE_FILE_from_test')
-
     config_fixture = fixture('test.gitconfig')
     self.config = git_config.GitConfig(config_fixture)
 
-  def tearDown(self):
-    self.tempdirobj.cleanup()
-
   def test_GetString_with_empty_config_values(self):
     """
     Test config entries with no value.
@@ -117,15 +109,9 @@
   """Read/write tests of the GitConfig class."""
 
   def setUp(self):
-    self.tempdirobj = tempfile.TemporaryDirectory(prefix='repo_tests')
-    repo_trace._TRACE_FILE = os.path.join(self.tempdirobj.name, 'TRACE_FILE_from_test')
-
     self.tmpfile = tempfile.NamedTemporaryFile()
     self.config = self.get_config()
 
-  def tearDown(self):
-    self.tempdirobj.cleanup()
-
   def get_config(self):
     """Get a new GitConfig instance."""
     return git_config.GitConfig(self.tmpfile.name)
diff --git a/tests/test_git_superproject.py b/tests/test_git_superproject.py
index 0bb7718..0ad9b01 100644
--- a/tests/test_git_superproject.py
+++ b/tests/test_git_superproject.py
@@ -24,7 +24,6 @@
 import git_superproject
 import git_trace2_event_log
 import manifest_xml
-import repo_trace
 from test_manifest_xml import sort_attributes
 
 
@@ -40,7 +39,6 @@
     """Set up superproject every time."""
     self.tempdirobj = tempfile.TemporaryDirectory(prefix='repo_tests')
     self.tempdir = self.tempdirobj.name
-    repo_trace._TRACE_FILE = os.path.join(self.tempdir, 'TRACE_FILE_from_test')
     self.repodir = os.path.join(self.tempdir, '.repo')
     self.manifest_file = os.path.join(
         self.repodir, manifest_xml.MANIFEST_FILE_NAME)
diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py
index f92108e..e181b64 100644
--- a/tests/test_manifest_xml.py
+++ b/tests/test_manifest_xml.py
@@ -23,7 +23,6 @@
 
 import error
 import manifest_xml
-import repo_trace
 
 
 # Invalid paths that we don't want in the filesystem.
@@ -94,7 +93,6 @@
   def setUp(self):
     self.tempdirobj = tempfile.TemporaryDirectory(prefix='repo_tests')
     self.tempdir = self.tempdirobj.name
-    repo_trace._TRACE_FILE = os.path.join(self.tempdir, 'TRACE_FILE_from_test')
     self.repodir = os.path.join(self.tempdir, '.repo')
     self.manifest_dir = os.path.join(self.repodir, 'manifests')
     self.manifest_file = os.path.join(
@@ -264,10 +262,10 @@
         '<project name="r" groups="keep"/>'
         '</manifest>')
     self.assertEqual(
-        sort_attributes(manifest.ToXml(omit_local=True).toxml()),
+        manifest.ToXml(omit_local=True).toxml(),
         '<?xml version="1.0" ?><manifest>'
-        '<remote fetch=".." name="a"/><default remote="a" revision="r"/>'
-        '<project name="q"/><project groups="keep" name="r"/></manifest>')
+        '<remote name="a" fetch=".."/><default remote="a" revision="r"/>'
+        '<project name="q"/><project name="r" groups="keep"/></manifest>')
 
   def test_toxml_with_local(self):
     """Does include local_manifests projects when omit_local=False."""
@@ -279,11 +277,11 @@
         '<project name="r" groups="keep"/>'
         '</manifest>')
     self.assertEqual(
-        sort_attributes(manifest.ToXml(omit_local=False).toxml()),
+        manifest.ToXml(omit_local=False).toxml(),
         '<?xml version="1.0" ?><manifest>'
-        '<remote fetch=".." name="a"/><default remote="a" revision="r"/>'
-        '<project groups="local::me" name="p"/>'
-        '<project name="q"/><project groups="keep" name="r"/></manifest>')
+        '<remote name="a" fetch=".."/><default remote="a" revision="r"/>'
+        '<project name="p" groups="local::me"/>'
+        '<project name="q"/><project name="r" groups="keep"/></manifest>')
 
   def test_repo_hooks(self):
     """Check repo-hooks settings."""
diff --git a/tests/test_project.py b/tests/test_project.py
index 5c600be..acd44cc 100644
--- a/tests/test_project.py
+++ b/tests/test_project.py
@@ -26,7 +26,6 @@
 import git_config
 import platform_utils
 import project
-import repo_trace
 
 
 @contextlib.contextmanager
@@ -65,13 +64,6 @@
 class ReviewableBranchTests(unittest.TestCase):
   """Check ReviewableBranch behavior."""
 
-  def setUp(self):
-    self.tempdirobj = tempfile.TemporaryDirectory(prefix='repo_tests')
-    repo_trace._TRACE_FILE = os.path.join(self.tempdirobj.name, 'TRACE_FILE_from_test')
-
-  def tearDown(self):
-    self.tempdirobj.cleanup()
-
   def test_smoke(self):
     """A quick run through everything."""
     with TempGitTree() as tempdir:
diff --git a/tests/test_subcmds_sync.py b/tests/test_subcmds_sync.py
index 13f3f87..aad713f 100644
--- a/tests/test_subcmds_sync.py
+++ b/tests/test_subcmds_sync.py
@@ -11,9 +11,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
 """Unittests for the subcmds/sync.py module."""
 
-import unittest
 from unittest import mock
 
 import pytest
@@ -21,14 +21,17 @@
 from subcmds import sync
 
 
-@pytest.mark.parametrize('use_superproject, cli_args, result', [
+@pytest.mark.parametrize(
+  'use_superproject, cli_args, result',
+  [
     (True, ['--current-branch'], True),
     (True, ['--no-current-branch'], True),
     (True, [], True),
     (False, ['--current-branch'], True),
     (False, ['--no-current-branch'], False),
     (False, [], None),
-])
+  ]
+)
 def test_get_current_branch_only(use_superproject, cli_args, result):
   """Test Sync._GetCurrentBranchOnly logic.
 
@@ -38,49 +41,5 @@
   cmd = sync.Sync()
   opts, _ = cmd.OptionParser.parse_args(cli_args)
 
-  with mock.patch('git_superproject.UseSuperproject',
-                  return_value=use_superproject):
+  with mock.patch('git_superproject.UseSuperproject', return_value=use_superproject):
     assert cmd._GetCurrentBranchOnly(opts, cmd.manifest) == result
-
-
-class GetPreciousObjectsState(unittest.TestCase):
-  """Tests for _GetPreciousObjectsState."""
-
-  def setUp(self):
-    """Common setup."""
-    self.cmd = sync.Sync()
-    self.project = p = mock.MagicMock(use_git_worktrees=False,
-                                      UseAlternates=False)
-    p.manifest.GetProjectsWithName.return_value = [p]
-
-    self.opt = mock.Mock(spec_set=['this_manifest_only'])
-    self.opt.this_manifest_only = False
-
-  def test_worktrees(self):
-    """False for worktrees."""
-    self.project.use_git_worktrees = True
-    self.assertFalse(self.cmd._GetPreciousObjectsState(self.project, self.opt))
-
-  def test_not_shared(self):
-    """Singleton project."""
-    self.assertFalse(self.cmd._GetPreciousObjectsState(self.project, self.opt))
-
-  def test_shared(self):
-    """Shared project."""
-    self.project.manifest.GetProjectsWithName.return_value = [
-        self.project, self.project
-    ]
-    self.assertTrue(self.cmd._GetPreciousObjectsState(self.project, self.opt))
-
-  def test_shared_with_alternates(self):
-    """Shared project, with alternates."""
-    self.project.manifest.GetProjectsWithName.return_value = [
-        self.project, self.project
-    ]
-    self.project.UseAlternates = True
-    self.assertFalse(self.cmd._GetPreciousObjectsState(self.project, self.opt))
-
-  def test_not_found(self):
-    """Project not found in manifest."""
-    self.project.manifest.GetProjectsWithName.return_value = []
-    self.assertFalse(self.cmd._GetPreciousObjectsState(self.project, self.opt))
