diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp
index da42a17bad48ed7051430789a536ae91338d9468..33470b43b8d0b6f314d7e4fff7b0c9673678cf8e 100644
--- a/src/plugins/coreplugin/vcsmanager.cpp
+++ b/src/plugins/coreplugin/vcsmanager.cpp
@@ -86,6 +86,11 @@ void VCSManager::extensionsInitialized()
     }
 }
 
+static bool longerThanPath(QPair<QString, IVersionControl *> &pair1, QPair<QString, IVersionControl *> &pair2)
+{
+    return pair1.first.size() > pair2.first.size();
+}
+
 IVersionControl* VCSManager::findVersionControlForDirectory(const QString &directory,
                                                             QString *topLevelDirectory)
 {
@@ -143,18 +148,34 @@ IVersionControl* VCSManager::findVersionControlForDirectory(const QString &direc
 
     // Nothing: ask the IVersionControls directly, insert the toplevel into the cache.
     const VersionControlList versionControls = allVersionControls();
+    QList<QPair<QString, IVersionControl *> > allThatCanManage;
+
     foreach (IVersionControl * versionControl, versionControls) {
         QString topLevel;
         if (versionControl->managesDirectory(directory, &topLevel)) {
-            m_d->m_cachedMatches.insert(topLevel, versionControl);
-            if (topLevelDirectory)
-                *topLevelDirectory = topLevel;
             if (debug)
-                qDebug("<findVersionControlForDirectory: invocation of '%s' matches: %s",
-                       qPrintable(versionControl->displayName()), qPrintable(topLevel));
-            return versionControl;
+                qDebug("<findVersionControlForDirectory: %s manages %s",
+                       qPrintable(versionControl->displayName()),
+                       qPrintable(topLevel));
+            allThatCanManage.push_back(qMakePair(topLevel, versionControl));
         }
     }
+
+    // To properly find a nested repository (say, git checkout inside SVN),
+    // we need to select the version control with the longest toplevel pathname.
+    qSort(allThatCanManage.begin(), allThatCanManage.end(), longerThanPath);
+
+    if (!allThatCanManage.isEmpty()) {
+        QString toplevel = allThatCanManage.first().first;
+        IVersionControl *versionControl = allThatCanManage.first().second;
+        m_d->m_cachedMatches.insert(toplevel, versionControl);
+        if (topLevelDirectory)
+            *topLevelDirectory = toplevel;
+        if (debug)
+            qDebug("<findVersionControlForDirectory: invocation of '%s' matches: %s",
+                   qPrintable(versionControl->displayName()), qPrintable(toplevel));
+        return versionControl;
+    }
     if (debug)
         qDebug("<findVersionControlForDirectory: No match for %s", qPrintable(directory));
     return 0;