diff --git a/lib/classes/plugin_manager.php b/lib/classes/plugin_manager.php
index <HASH>..<HASH> 100644
--- a/lib/classes/plugin_manager.php
+++ b/lib/classes/plugin_manager.php
@@ -654,6 +654,10 @@ class core_plugin_manager {
             return 'git';
         }
 
+        if (is_file($pluginroot.'/.git')) {
+            return 'git-submodule';
+        }
+
         if (is_dir($pluginroot.'/CVS')) {
             return 'cvs';
         }
diff --git a/lib/classes/update/deployer.php b/lib/classes/update/deployer.php
index <HASH>..<HASH> 100644
--- a/lib/classes/update/deployer.php
+++ b/lib/classes/update/deployer.php
@@ -181,6 +181,10 @@ class deployer {
             return 'git';
         }
 
+        if (is_file($pluginroot.'/.git')) {
+            return 'git-submodule';
+        }
+
         if (is_dir($pluginroot.'/CVS')) {
             return 'cvs';
         }
MDL-<I> admin: Check if the plugin is a git submodule on uninstalling

Credit goes to PJ King. I was trying to add unit tests for this new
behaviour but it turned out there are many hard-coded dependencies and
it's not easy to make the whole machinery support alternative location
of testable (fake) plugins.