diff --git a/meta/classes/externalsrc.bbclass b/meta/classes/externalsrc.bbclass
index 902ff2604f..0dd57af668 100644
--- a/meta/classes/externalsrc.bbclass
+++ b/meta/classes/externalsrc.bbclass
@@ -234,8 +234,43 @@ def srctree_hash_files(d, srcdir=None):
             # Update our custom index
             env = os.environ.copy()
             env['GIT_INDEX_FILE'] = tmp_index.name
-            subprocess.check_output(['git', 'add', '-A', '.'], cwd=s_dir, env=env)
+            # Find nested git repos created by multiple SRC_URI git entries with
+            # different destsuffix values. git add -A . exits 128 when it encounters
+            # these unregistered nested repos.
+            nested_git_dirs = []
+            for root, dirs, files in os.walk(s_dir):
+                if root == s_dir:
+                    continue
+                if '.git' in dirs or '.git' in files:
+                    nested_git_dirs.append(root)
+                    dirs[:] = []  # don't recurse into nested repos
+            if nested_git_dirs:
+                excludes = [':(exclude)' + os.path.relpath(n, s_dir) for n in nested_git_dirs]
+                subprocess.check_output(['git', 'add', '-A', '.'] + excludes, cwd=s_dir, env=env)
+            else:
+                subprocess.check_output(['git', 'add', '-A', '.'], cwd=s_dir, env=env)
             git_sha1 = subprocess.check_output(['git', 'write-tree'], cwd=s_dir, env=env).decode("utf-8")
+            # Hash each nested git repo separately so source changes there still
+            # trigger do_compile/do_configure to re-run.
+            for nested in nested_git_dirs:
+                nested_git = os.path.join(nested, '.git')
+                if not os.path.isdir(nested_git):
+                    continue
+                with tempfile.NamedTemporaryFile(prefix='oe-devtool-nested-index') as nested_tmp:
+                    nested_index = os.path.join(nested_git, 'index')
+                    if os.path.exists(nested_index):
+                        shutil.copyfile(nested_index, nested_tmp.name)
+                    nested_env = os.environ.copy()
+                    nested_env['GIT_INDEX_FILE'] = nested_tmp.name
+                    proc = subprocess.Popen(['git', 'add', '-A', '.'], cwd=nested,
+                                           env=nested_env, stdout=subprocess.DEVNULL,
+                                           stderr=subprocess.DEVNULL)
+                    proc.communicate()
+                    proc = subprocess.Popen(['git', 'write-tree'], cwd=nested,
+                                           env=nested_env, stdout=subprocess.PIPE,
+                                           stderr=subprocess.DEVNULL)
+                    stdout, _ = proc.communicate()
+                    git_sha1 += stdout.decode("utf-8")
             if os.path.exists(os.path.join(s_dir, ".gitmodules")) and os.path.getsize(os.path.join(s_dir, ".gitmodules")) > 0:
                 submodule_helper = subprocess.check_output(["git", "config", "--file", ".gitmodules", "--get-regexp", "path"], cwd=s_dir, env=env).decode("utf-8")
                 for line in submodule_helper.splitlines():
