diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
index c824718a1dd..29e0af648e6 100644
--- a/meta/classes/archiver.bbclass
+++ b/meta/classes/archiver.bbclass
@@ -230,7 +230,14 @@ python do_ar_original() {
                     else:
                         bb.fatal("Cannot determine archive names for original source because 'name=' URL parameter '%s' is used twice. Make it unique in: %s %s" % (tarball_suffix[name], url))
             tarball_suffix[name] = url
-            create_tarball(d, os.path.join(tmpdir, d.getVar('BP'), '.'), name, ar_outdir)
+            # unpacked source may not be ${BP}, e.g. git with subpath.
+            # Use the single top-level directory when present, otherwise tmpdir.
+            entries = os.listdir(tmpdir)
+            if len(entries) == 1 and os.path.isdir(os.path.join(tmpdir, entries[0])):
+                srcsubdir = os.path.join(tmpdir, entries[0], '.')
+            else:
+                srcsubdir = os.path.join(tmpdir, '.')
+            create_tarball(d, srcsubdir, name, ar_outdir)
 
     # Emit patch series files for 'original'
     bb.note('Writing patch series files...')
