diff --git a/lib/workers/repository/updates/branch-name.spec.ts b/lib/workers/repository/updates/branch-name.spec.ts
index 3475b7328795b299b5f7817c87c21d8968163f5c..a1436ee7c3b4b262928b37d4e4c84ee4340444ba 100644
--- a/lib/workers/repository/updates/branch-name.spec.ts
+++ b/lib/workers/repository/updates/branch-name.spec.ts
@@ -220,7 +220,7 @@ describe('workers/repository/updates/branch-name', () => {
         },
         {
           upgrade: { branchName: 'renovate/~bad-branch-name2' },
-          expectedBranchName: 'renovate/-bad-branch-name2',
+          expectedBranchName: 'renovate/bad-branch-name2',
         },
         {
           upgrade: { branchName: 'renovate/bad-branch-^-name3' },
@@ -258,6 +258,10 @@ describe('workers/repository/updates/branch-name', () => {
           upgrade: { branchName: 'renovate/bad--branch---name11' },
           expectedBranchName: 'renovate/bad-branch-name11',
         },
+        {
+          upgrade: { branchName: 'renovate-/[start]-something-[end]' },
+          expectedBranchName: 'renovate/start-something-end',
+        },
       ];
       fixtures.forEach((fixture) => {
         generateBranchName(fixture.upgrade);
diff --git a/lib/workers/repository/updates/branch-name.ts b/lib/workers/repository/updates/branch-name.ts
index 15433fb94b2004b129ba231d4445baeeb4e3302c..7e45f0802df0efe0005f91867f8eaf1bcc027bed 100644
--- a/lib/workers/repository/updates/branch-name.ts
+++ b/lib/workers/repository/updates/branch-name.ts
@@ -24,6 +24,8 @@ function cleanBranchName(branchName: string): string {
     .replace(regEx(/\/\./g), '/') // leading dot after slash
     .replace(regEx(/\s/g), '') // whitespace
     .replace(regEx(/[[\]?:\\^~]/g), '-') // massage out all these characters: : ? [ \ ^ ~
+    .replace(regEx(/(^|\/)-+/g), '$1') // leading dashes
+    .replace(regEx(/-+(\/|$)/g), '$1') // trailing dashes
     .replace(RE_MULTIPLE_DASH, '-'); // chained dashes
 }