diff --git a/scripts/patch.sh b/scripts/patch.sh
index 90d2de7bcaab0b89930353fd91a48ea3f7a58fa9..2b0aa29e068dc27995978ba09c8355b0c1bcab04 100755
--- a/scripts/patch.sh
+++ b/scripts/patch.sh
@@ -5,19 +5,27 @@ shopt -s nullglob
 
 . "$GLUONDIR"/scripts/modules.sh
 
+TMPDIR="$GLUON_BUILDDIR"/tmp
+
+mkdir -p "$TMPDIR"
+
+PATCHDIR="$TMPDIR"/patching
+trap 'rm -rf "$PATCHDIR"' EXIT
+
 for module in $GLUON_MODULES; do
 	echo "--- Patching module '$module' ---"
 
-	cd "$GLUONDIR"/$module
-	git checkout -B patching base
+	git clone -s -b base --single-branch "$GLUONDIR"/$module "$PATCHDIR" 2>/dev/null
 
+	cd "$PATCHDIR"
 	for patch in "$GLUONDIR"/patches/$module/*.patch; do
-		if ! git -c user.name='Gluon Patch Manager' -c user.email='gluon@void.example.com' -c commit.gpgsign=false am --whitespace=nowarn --committer-date-is-author-date "$patch"; then
-			git am --abort
-			git checkout patched
-			git branch -D patching
-			exit 1
-		fi
+		git -c user.name='Gluon Patch Manager' -c user.email='gluon@void.example.com' -c commit.gpgsign=false am --whitespace=nowarn --committer-date-is-author-date "$patch"
 	done
-	git branch -M patched
+
+	cd "$GLUONDIR"/$module
+	git fetch "$PATCHDIR" 2>/dev/null
+	git checkout -B patched FETCH_HEAD
+	git submodule update --init --recursive
+
+	rm -rf "$PATCHDIR"
 done
diff --git a/scripts/update.sh b/scripts/update.sh
index 86c69628bed10285e7e90c6634a1c62fa5cc452b..8aa987315a65813b0d6b589842741f5425c94b4b 100755
--- a/scripts/update.sh
+++ b/scripts/update.sh
@@ -14,8 +14,7 @@ for module in $GLUON_MODULES; do
 	mkdir -p "$GLUONDIR"/$module
 	cd "$GLUONDIR"/$module
 	git init
+	git config commit.gpgsign false
 
-	git checkout $commit 2>/dev/null || git fetch $repo $branch
-	git checkout -B base $commit
-	git submodule update --init --recursive
+	git branch -f base $commit 2>/dev/null || git fetch -f $repo $branch:base
 done