diff --git a/gclient.py b/gclient.py
index 472bb8b..e2491ce 100755
--- a/gclient.py
+++ b/gclient.py
@@ -87,7 +87,6 @@
 import posixpath
 import pprint
 import re
-import socket
 import sys
 import time
 import urllib
@@ -669,40 +668,6 @@
             command, options, parsed_url, self.parent.name, revision_overrides)
         self._used_scm = gclient_scm.CreateSCM(
             parsed_url, self.root.root_dir, self.name)
-
-        def enable_deletion_of_conflicting_checkouts():
-          """Determines whether to enable new checkout deletion behavior.
-
-          Initially, enables the experimental functionality on a small set of
-          bots.
-          """
-          # TODO(borenet): Remove this hack as soon as we've verified that it
-          # doesn't cause the bots to break.
-          return (os.environ.get('CHROME_HEADLESS') and
-                  socket.gethostname() in ('vm859-m1', 'build1-m1', 'vm630-m1'))
-
-        # When updating, determine whether the destination directory contains a
-        # checkout of the desired repository. If not, avoid conflicts by
-        # deleting the directory before running the update.
-        if command == 'update' and enable_deletion_of_conflicting_checkouts():
-          logging.warning('Experimental deletion of mismatching checkouts '
-                          'enabled.')
-          actual_remote_url = self._used_scm.GetRemoteURL(options)
-          url, _ = gclient_utils.SplitUrlRevision(parsed_url)
-          url = url.rstrip('/')
-          dest_dir = os.path.join(self.root.root_dir, self.name)
-          if os.path.isdir(dest_dir) and actual_remote_url != url:
-            if options.force:
-              logging.warning('%s does not contain a checkout of %s. Removing '
-                              ' %s' % (dest_dir, url, dest_dir))
-              gclient_utils.rmtree(dest_dir)
-            else:
-              raise gclient_utils.Error('%s does not contain a checkout of %s '
-                                        '(found %s instead). Please fix the '
-                                        'solution manually or run with --force '
-                                        'to delete automatically.' % (
-                                            dest_dir, url, actual_remote_url))
-
         self._got_revision = self._used_scm.RunCommand(command, options, args,
                                                        file_list)
         if file_list:
diff --git a/gclient_scm.py b/gclient_scm.py
index 42b8142..3130634 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -210,21 +210,6 @@
   def GetCheckoutRoot(self):
     return scm.GIT.GetCheckoutRoot(self.checkout_path)
 
-  def GetRemoteURL(self, options, cwd=None):
-    try:
-      return self._Capture(['config', 'remote.%s.url' % self.remote],
-                           cwd=cwd or self.checkout_path).rstrip()
-    except (OSError, subprocess2.CalledProcessError):
-      pass
-    try:
-      # This may occur if we have a git-svn checkout.
-      if scm.GIT.IsGitSvn(os.curdir):
-        return scm.GIT.Capture(['config', '--local', '--get',
-                                'svn-remote.svn.url'], os.curdir).rstrip()
-    except (OSError, subprocess2.CalledProcessError):
-      pass
-    return None
-
   def GetRevisionDate(self, _revision):
     """Returns the given revision's date in ISO-8601 format (which contains the
     time zone)."""
@@ -280,6 +265,22 @@
 
     gclient_utils.CheckCallAndFilter(cmd4, **kwargs)
 
+  def _FetchAndReset(self, revision, file_list, options):
+    """Equivalent to git fetch; git reset."""
+    quiet = []
+    if not options.verbose:
+      quiet = ['--quiet']
+    self._UpdateBranchHeads(options, fetch=False)
+
+    fetch_cmd = [
+      '-c', 'core.deltaBaseCacheLimit=2g', 'fetch', self.remote, '--prune']
+    self._Run(fetch_cmd + quiet, options, retry=True)
+    self._Run(['reset', '--hard', revision] + quiet, options)
+    self.UpdateSubmoduleConfig()
+    if file_list is not None:
+      files = self._Capture(['ls-files']).splitlines()
+      file_list.extend([os.path.join(self.checkout_path, f) for f in files])
+
   def update(self, options, args, file_list):
     """Runs git to update or transparently checkout the working copy.
 
@@ -366,10 +367,35 @@
                                 '\tAnd run gclient sync again\n'
                                 % (self.relpath, rev_str, self.relpath))
 
+    # See if the url has changed (the unittests use git://foo for the url, let
+    # that through).
+    current_url = self._Capture(['config', 'remote.%s.url' % self.remote])
+    return_early = False
+    # TODO(maruel): Delete url != 'git://foo' since it's just to make the
+    # unit test pass. (and update the comment above)
+    # Skip url auto-correction if remote.origin.gclient-auto-fix-url is set.
+    # This allows devs to use experimental repos which have a different url
+    # but whose branch(s) are the same as official repos.
+    if (current_url != url and
+        url != 'git://foo' and
+        subprocess2.capture(
+            ['git', 'config', 'remote.%s.gclient-auto-fix-url' % self.remote],
+            cwd=self.checkout_path).strip() != 'False'):
+      print('_____ switching %s to a new upstream' % self.relpath)
+      # Make sure it's clean
+      self._CheckClean(rev_str)
+      # Switch over to the new upstream
+      self._Run(['remote', 'set-url', self.remote, url], options)
+      self._FetchAndReset(revision, file_list, options)
+      return_early = True
+
     # Need to do this in the normal path as well as in the post-remote-switch
     # path.
     self._PossiblySwitchCache(url, options)
 
+    if return_early:
+      return self._Capture(['rev-parse', '--verify', 'HEAD'])
+
     cur_branch = self._GetCurrentBranch()
 
     # Cases:
@@ -782,7 +808,8 @@
         # to relax this restriction in the future to allow for smarter cache
         # repo update schemes (such as pulling the same repo, but from a
         # different host).
-        existing_url = self.GetRemoteURL(options, cwd=folder)
+        existing_url = self._Capture(['config', 'remote.%s.url' % self.remote],
+                                     cwd=folder)
         assert self._NormalizeGitURL(existing_url) == self._NormalizeGitURL(url)
 
         if use_reference:
@@ -1071,22 +1098,6 @@
   def GetCheckoutRoot(self):
     return scm.SVN.GetCheckoutRoot(self.checkout_path)
 
-  def GetRemoteURL(self, options):
-    try:
-      return scm.SVN.CaptureLocalInfo([os.curdir],
-                                      self.checkout_path).get('URL')
-    except (OSError, subprocess2.CalledProcessError):
-      pass
-    try:
-      # This may occur if we have a git-svn checkout.
-      if scm.GIT.IsGitSvn(os.curdir):
-        return scm.GIT.Capture(['config', '--local', '--get',
-                                'svn-remote.svn.url'], os.curdir).rstrip()
-    except (OSError, subprocess2.CalledProcessError):
-      pass
-    return None
-
-
   def GetRevisionDate(self, revision):
     """Returns the given revision's date in ISO-8601 format (which contains the
     time zone)."""
@@ -1126,10 +1137,15 @@
     Raises:
       Error: if can't get URL for relative path.
     """
-    exists = os.path.exists(self.checkout_path)
+    # Only update if git or hg is not controlling the directory.
+    git_path = os.path.join(self.checkout_path, '.git')
+    if os.path.exists(git_path):
+      print('________ found .git directory; skipping %s' % self.relpath)
+      return
 
-    if exists and scm.GIT.IsGitSvn(self.checkout_path):
-      print '________ %s looks like git-svn; skipping.' % self.relpath
+    hg_path = os.path.join(self.checkout_path, '.hg')
+    if os.path.exists(hg_path):
+      print('________ found .hg directory; skipping %s' % self.relpath)
       return
 
     if args:
@@ -1138,6 +1154,8 @@
     # revision is the revision to match. It is None if no revision is specified,
     # i.e. the 'deps ain't pinned'.
     url, revision = gclient_utils.SplitUrlRevision(self.url)
+    # Keep the original unpinned url for reference in case the repo is switched.
+    base_url = url
     managed = True
     if options.revision:
       # Override the revision number.
@@ -1156,6 +1174,7 @@
       rev_str = ''
 
     # Get the existing scm url and the revision number of the current checkout.
+    exists = os.path.exists(self.checkout_path)
     if exists and managed:
       try:
         from_info = scm.SVN.CaptureLocalInfo(
@@ -1291,6 +1310,53 @@
       revision = str(from_info_live['Revision'])
       rev_str = ' at %s' % revision
 
+    if from_info['URL'] != base_url:
+      # The repository url changed, need to switch.
+      try:
+        to_info = scm.SVN.CaptureRemoteInfo(url)
+      except (gclient_utils.Error, subprocess2.CalledProcessError):
+        # The url is invalid or the server is not accessible, it's safer to bail
+        # out right now.
+        raise gclient_utils.Error('This url is unreachable: %s' % url)
+      can_switch = ((from_info['Repository Root'] != to_info['Repository Root'])
+                    and (from_info['UUID'] == to_info['UUID']))
+      if can_switch:
+        print('\n_____ relocating %s to a new checkout' % self.relpath)
+        # We have different roots, so check if we can switch --relocate.
+        # Subversion only permits this if the repository UUIDs match.
+        # Perform the switch --relocate, then rewrite the from_url
+        # to reflect where we "are now."  (This is the same way that
+        # Subversion itself handles the metadata when switch --relocate
+        # is used.)  This makes the checks below for whether we
+        # can update to a revision or have to switch to a different
+        # branch work as expected.
+        # TODO(maruel):  TEST ME !
+        command = ['switch', '--relocate',
+                   from_info['Repository Root'],
+                   to_info['Repository Root'],
+                   self.relpath]
+        self._Run(command, options, cwd=self._root_dir)
+        from_info['URL'] = from_info['URL'].replace(
+            from_info['Repository Root'],
+            to_info['Repository Root'])
+      else:
+        if not options.force and not options.reset:
+          # Look for local modifications but ignore unversioned files.
+          for status in scm.SVN.CaptureStatus(None, self.checkout_path):
+            if status[0][0] != '?':
+              raise gclient_utils.Error(
+                  ('Can\'t switch the checkout to %s; UUID don\'t match and '
+                   'there is local changes in %s. Delete the directory and '
+                   'try again.') % (url, self.checkout_path))
+        # Ok delete it.
+        print('\n_____ switching %s to a new checkout' % self.relpath)
+        gclient_utils.rmtree(self.checkout_path)
+        # We need to checkout.
+        command = ['checkout', url, self.checkout_path]
+        command = self._AddAdditionalUpdateFlags(command, options, revision)
+        self._RunAndGetFileList(command, options, file_list, self._root_dir)
+        return self.Svnversion()
+
     # If the provided url has a revision number that matches the revision
     # number of the existing directory, then we don't need to bother updating.
     if not options.force and str(from_info['Revision']) == revision:
@@ -1357,8 +1423,11 @@
       return self.update(options, [], file_list)
 
     if not os.path.isdir(os.path.join(self.checkout_path, '.svn')):
-      if scm.GIT.IsGitSvn(self.checkout_path):
-        print '________ %s looks like git-svn; skipping.' % self.relpath
+      if os.path.isdir(os.path.join(self.checkout_path, '.git')):
+        print('________ found .git directory; skipping %s' % self.relpath)
+        return
+      if os.path.isdir(os.path.join(self.checkout_path, '.hg')):
+        print('________ found .hg directory; skipping %s' % self.relpath)
         return
       if not options.force:
         raise gclient_utils.Error('Invalid checkout path, aborting')
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py
index 03a382e..741727e 100755
--- a/tests/gclient_scm_test.py
+++ b/tests/gclient_scm_test.py
@@ -101,7 +101,6 @@
         'BinaryExists',
         'FullUrlForRelativeUrl',
         'GetCheckoutRoot',
-        'GetRemoteURL',
         'GetRevisionDate',
         'GetUsableRev',
         'Svnversion',
@@ -162,9 +161,9 @@
 
   def testRunCommandException(self):
     options = self.Options(verbose=False)
-    gclient_scm.os.path.exists(self.base_path).AndReturn(True)
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
+
     self.mox.ReplayAll()
     scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
                             relpath=self.relpath)
@@ -183,6 +182,8 @@
     gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
         ).AndReturn('1.5.1')
     # It'll to a checkout instead.
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     # Checkout.
     gclient_scm.os.path.exists(self.base_path).AndReturn(False)
     parent = gclient_scm.os.path.dirname(self.base_path)
@@ -210,14 +211,16 @@
     options = self.Options(verbose=True, force=True)
     gclient_scm.os.path.isdir(self.base_path).AndReturn(True)
     gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False)
+    gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False)
     # Checkout.
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(False)
     parent = gclient_scm.os.path.dirname(self.base_path)
     gclient_scm.os.path.exists(parent).AndReturn(False)
     gclient_scm.os.makedirs(parent)
     gclient_scm.os.path.exists(parent).AndReturn(True)
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
     files_list = self.mox.CreateMockAnything()
     gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None
         ).AndReturn('1.6')
@@ -337,6 +340,8 @@
     file_info.url = self.url
     file_info.uuid = 'ABC'
     file_info.revision = 42
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     # Checkout.
     gclient_scm.os.path.exists(self.base_path).AndReturn(False)
     parent = gclient_scm.os.path.dirname(self.base_path)
@@ -368,8 +373,8 @@
       'UUID': 'ABC',
       'Revision': 42,
     }
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
 
     # Checkout or update.
@@ -414,8 +419,8 @@
       'UUID': 'ABC',
       'Revision': 42,
     }
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
 
     # Checkout or update.
@@ -450,8 +455,8 @@
       'UUID': 'ABC',
       'Revision': 42,
     }
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
 
     # Checkout or update.
@@ -516,8 +521,8 @@
         file_list=files_list)
 
     # Now we fall back on scm.update().
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
     gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info)
     gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None
@@ -586,8 +591,8 @@
         file_list=files_list)
 
     # Now we fall back on scm.update().
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
     gclient_scm.scm.SVN._CaptureInfo(
         [], join(self.base_path, ".")).AndReturn(file_info)
@@ -622,8 +627,8 @@
 
     # Now we fall back on scm.update().
     files_list = self.mox.CreateMockAnything()
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False)
     gclient_scm.os.path.exists(self.base_path).AndReturn(True)
     gclient_scm.scm.SVN._CaptureInfo(
         [], join(self.base_path, '.')).AndReturn(file_info)
@@ -639,11 +644,10 @@
     scm.updatesingle(options, ['DEPS'], files_list)
     self.checkstdout('\n_____ %s at 42\n' % self.relpath)
 
-  def testUpdateGitSvn(self):
+  def testUpdateGit(self):
     options = self.Options(verbose=True)
-    gclient_scm.os.path.exists(self.base_path).AndReturn(True)
-    self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'IsGitSvn', True)
-    gclient_scm.scm.GIT.IsGitSvn(self.base_path).AndReturn(True)
+    file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git')
+    gclient_scm.os.path.exists(file_path).AndReturn(True)
 
     self.mox.ReplayAll()
     scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
@@ -651,7 +655,20 @@
     file_list = []
     scm.update(options, self.args, file_list)
     self.checkstdout(
-        ('________ %s looks like git-svn; skipping.\n' % self.relpath))
+        ('________ found .git directory; skipping %s\n' % self.relpath))
+
+  def testUpdateHg(self):
+    options = self.Options(verbose=True)
+    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False)
+    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True)
+
+    self.mox.ReplayAll()
+    scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
+                            relpath=self.relpath)
+    file_list = []
+    scm.update(options, self.args, file_list)
+    self.checkstdout(
+        ('________ found .hg directory; skipping %s\n' % self.relpath))
 
   def testGetUsableRevSVN(self):
     # pylint: disable=E1101
@@ -674,48 +691,6 @@
     self.assertRaises(gclient_scm.gclient_utils.Error,
                       svn_scm.GetUsableRev, 'fake', options)
 
-  def testGetRemoteURL(self):
-    self.mox.UnsetStubs()
-    options = self.Options(verbose=True)
-    self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture', True)
-    svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
-                                relpath=self.relpath)
-
-    if svn_scm.relpath:
-      cwd = os.path.join(svn_scm._root_dir, svn_scm.relpath)
-    else:
-      cwd = svn_scm._root_dir
-
-    gclient_scm.scm.SVN.Capture(['info', '--xml', os.curdir], cwd).AndReturn(
-"""<?xml version="1.0"?>
-<info>
-<entry
-   path="."
-   revision="1234"
-   kind="dir">
-<url>%s</url>
-<repository>
-<root>https://dummy.repo.com/svn</root>
-<uuid>FAKE</uuid>
-</repository>
-<wc-info>
-<schedule>normal</schedule>
-<depth>infinity</depth>
-</wc-info>
-<commit
-   revision="1234">
-<author>fakedev@chromium.org</author>
-<date>2013-11-14T15:08:21.757885Z</date>
-</commit>
-</entry>
-</info>
-""" % svn_scm.url)
-
-    self.mox.ReplayAll()
-
-    self.assertEquals(svn_scm.GetRemoteURL(options), self.url)
-
-
 class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils,
                              unittest.TestCase):
   """This class doesn't use pymox."""
@@ -861,7 +836,6 @@
         'BinaryExists',
         'FullUrlForRelativeUrl',
         'GetCheckoutRoot',
-        'GetRemoteURL',
         'GetRevisionDate',
         'GetUsableRev',
         'RunCommand',
@@ -1277,18 +1251,6 @@
     self.assertRaises(gclient_scm.gclient_utils.Error,
                       git_svn_scm.GetUsableRev, too_big, options)
 
-  def testGetRemoteURL(self):
-    options = self.Options(verbose=True)
-    self.mox.StubOutWithMock(gclient_scm.GitWrapper, '_Capture', True)
-    git_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir,
-                                relpath=self.relpath)
-    git_scm._Capture(['config', 'remote.origin.url'], cwd='/tmp/fake'
-                     ).AndReturn('%s\n' % git_scm.url)
-
-    self.mox.ReplayAll()
-
-    self.assertEquals(git_scm.GetRemoteURL(options), self.url)
-
 
 class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase):
   def testUpdateUpdate(self):
diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py
index 896238d..c05bbf3 100755
--- a/tests/gclient_smoketest.py
+++ b/tests/gclient_smoketest.py
@@ -13,7 +13,6 @@
 import logging
 import os
 import re
-import socket
 import subprocess
 import sys
 import unittest
@@ -110,9 +109,9 @@
               not re.match(
                   r'_____ [^ ]+ : Attempting rebase onto [0-9a-f]+...',
                   line) and
-              not re.match(r'_____ [^ ]+ at [^ ]+', line) and not
-              re.match(r'________ (.*) looks like git-svn; skipping.', line)):
-            # The regexp above are a bit too broad.
+              not re.match(r'_____ [^ ]+ at [^ ]+', line)):
+            # The two regexp above are a bit too broad, they are necessary only
+            # for git checkouts.
             self.fail(line)
         else:
           results.append([[match.group(1), match.group(2), match.group(3)]])
@@ -777,42 +776,7 @@
 
     # Cripple src/third_party/foo and make sure gclient still succeeds.
     gclient_utils.rmtree(join(third_party, 'foo', '.svn'))
-    self.assertEquals(0, self.gclient(cmd + ['--force'])[-1])
-
-  def testSkipGitSvn(self):
-    # Check that gclient skips git-svn checkouts.
-    if not self.enabled:
-      return
-
-    # Create the .gclient file.
-    svn_url = self.svn_base + 'trunk/src'
-    self.gclient(['config', svn_url], cwd=self.root_dir)
-
-    # Create a git-svn checkout.
-    subprocess2.check_call(['git', 'svn', 'clone', svn_url], cwd=self.root_dir)
-
-    # Ensure that gclient skips the git-svn checkout.
-    stdout, stderr, rc = self.gclient(['sync', '--jobs', '1'])
-    self.assertEquals(rc, 0)
-    self.assertFalse(stderr)
-    self.assertTrue('________ src looks like git-svn; skipping.' in stdout)
-    self.checkBlock(stdout, [
-        ['running', self.root_dir],
-        ['running', os.path.join(self.root_dir, 'src', 'file', 'other')],
-        ['running', self.root_dir],
-        ['running', self.root_dir],
-        ['running', self.root_dir],
-        ['running', self.root_dir],
-    ])
-
-    # But, we still need the DEPS to be checked out...
-    foo_dir = os.path.join(self.root_dir, 'src', 'third_party', 'foo')
-    foo_rev = subprocess2.check_output(['svnversion', foo_dir]).strip()
-    self.assertEquals(foo_rev, '1')
-
-    other_dir = os.path.join(self.root_dir, 'src', 'other')
-    other_rev = subprocess2.check_output(['svnversion', other_dir]).strip()
-    self.assertEquals(other_rev, '2')
+    self.assertEquals(0, self.gclient(cmd)[-1])
 
 
 class GClientSmokeSVNTransitive(GClientSmokeBase):
@@ -1139,7 +1103,7 @@
     self.assertTree(tree)
 
     # Pre-DEPS hooks run when syncing with --nohooks.
-    self.gclient(['sync', '--deps', 'mac', '--nohooks', '--force',
+    self.gclient(['sync', '--deps', 'mac', '--nohooks',
                   '--revision', 'src@' + self.githash('repo_5', 2)])
     tree = self.mangle_git_tree(('repo_5@2', 'src'),
                                 ('repo_1@2', 'src/repo1'),
@@ -1151,7 +1115,7 @@
     os.remove(join(self.root_dir, 'src', 'git_pre_deps_hooked'))
 
     # Pre-DEPS hooks don't run with --noprehooks
-    self.gclient(['sync', '--deps', 'mac', '--noprehooks', '--force',
+    self.gclient(['sync', '--deps', 'mac', '--noprehooks',
                   '--revision', 'src@' + self.githash('repo_5', 2)])
     tree = self.mangle_git_tree(('repo_5@2', 'src'),
                                 ('repo_1@2', 'src/repo1'),
@@ -1379,81 +1343,6 @@
 
     self.assertEquals(sorted(entries), sorted(expected))
 
-  # TODO(borenet): Enable this at the same time that the guard is removed in
-  # gclient.
-  if (os.environ.get('CHROME_HEADLESS') and
-      socket.gethostname() in ('vm859-m1', 'build1-m1', 'vm630-m1')):
-    def testDeleteConflictingCheckout(self):
-      if not self.enabled:
-        return
-  
-      # Create an initial svn checkout.
-      self.gclient(['config', '--spec',
-          'solutions=['
-          '{"name": "src",'
-          ' "url": "' + self.svn_base + 'trunk/src"},'
-          ']'
-      ])
-      results = self.gclient(['sync', '--deps', 'mac'])
-      self.assertEqual(results[2], 0, 'Sync failed!')
-  
-      # Verify that we have the expected svn checkout.
-      results = self.gclient(['revinfo', '--deps', 'mac'])
-      actual = results[0].splitlines()
-      expected = [
-        'src: %strunk/src' % self.svn_base,
-        'src/file/other: File("%strunk/other/DEPS")' % self.svn_base,
-        'src/other: %strunk/other' % self.svn_base,
-        'src/third_party/foo: %strunk/third_party/foo@1' % self.svn_base,
-      ]
-      self.assertEquals(actual, expected)
-  
-      # Change the desired checkout to git.
-      self.gclient(['config', '--spec',
-          'solutions=['
-          '{"name": "src",'
-          ' "url": "' + self.git_base + 'repo_1"},'
-          ']'
-      ])
-  
-      # Verify that the sync succeeds with --force.
-      results = self.gclient(['sync', '--deps', 'mac', '--force'])
-      self.assertEqual(results[2], 0, 'Sync failed!')
-  
-      # Verify that we got the desired git checkout.
-      results = self.gclient(['revinfo', '--deps', 'mac'])
-      actual = results[0].splitlines()
-      expected = [
-        'src: %srepo_1' % self.git_base,
-        'src/repo2: %srepo_2@%s' % (self.git_base,
-                                    self.githash('repo_2', 1)[:7]),
-        'src/repo2/repo_renamed: %srepo_3' % self.git_base,
-      ]
-      self.assertEquals(actual, expected)
-  
-      # Change the desired checkout back to svn.
-      self.gclient(['config', '--spec',
-          'solutions=['
-          '{"name": "src",'
-          ' "url": "' + self.svn_base + 'trunk/src"},'
-          ']'
-      ])
-  
-      # Verify that the sync succeeds.
-      results = self.gclient(['sync', '--deps', 'mac', '--force'])
-      self.assertEqual(results[2], 0, 'Sync failed!')
-  
-      # Verify that we have the expected svn checkout.
-      results = self.gclient(['revinfo', '--deps', 'mac'])
-      actual = results[0].splitlines()
-      expected = [
-        'src: %strunk/src' % self.svn_base,
-        'src/file/other: File("%strunk/other/DEPS")' % self.svn_base,
-        'src/other: %strunk/other' % self.svn_base,
-        'src/third_party/foo: %strunk/third_party/foo@1' % self.svn_base,
-      ]
-      self.assertEquals(actual, expected)
-
 
 class GClientSmokeFromCheckout(GClientSmokeBase):
   # WebKit abuses this. It has a .gclient and a DEPS from a checkout.
