From 974b4ae4f0c9869459b727cbfe090921246178c2 Mon Sep 17 00:00:00 2001 From: Peter Gaultney Date: Fri, 14 Aug 2026 14:39:26 -0400 Subject: [PATCH] fix: Abort stuck rebase before pulling from remote A failed `git pull --rebase` (network timeout, SSH glitch mid-rebase) leaves `.git/rebase-merge` behind. Every subsequent pull attempt then hits "already a rebase-merge directory" and the connector stays wedged until a pod restart. Detect and abort in-progress rebases at the top of `_pull_from_remote` and before re-raising non-conflict rebase errors. If `git rebase --abort` itself fails, remove the rebase state directories manually. --- persistence.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/persistence.py b/persistence.py index cccf24d..f8d3892 100644 --- a/persistence.py +++ b/persistence.py @@ -1012,6 +1012,21 @@ def _repair_tracking_branch_if_obvious(self, repo_key: str, git_repo: git.Repo, logger.warning(f"Failed to repair upstream tracking for {repo_key}: {e}") return None + def _abort_stuck_rebase(self, git_repo: git.Repo, repo_key: str): + """Abort any in-progress rebase so subsequent git operations don't wedge.""" + rebase_merge_dir = os.path.join(git_repo.git_dir, "rebase-merge") + rebase_apply_dir = os.path.join(git_repo.git_dir, "rebase-apply") + if os.path.isdir(rebase_merge_dir) or os.path.isdir(rebase_apply_dir): + logger.warning(f"Aborting stuck rebase for {repo_key}") + try: + git_repo.git.rebase("--abort") + except git.exc.GitCommandError as e: + logger.warning( + f"rebase --abort failed for {repo_key}, removing rebase state manually: {e}" + ) + shutil.rmtree(rebase_merge_dir, ignore_errors=True) + shutil.rmtree(rebase_apply_dir, ignore_errors=True) + def _pull_from_remote(self, repo_key: str, git_repo: git.Repo): """Pull latest changes from remote repository using rebase""" try: @@ -1022,6 +1037,8 @@ def _pull_from_remote(self, repo_key: str, git_repo: git.Repo): logger.debug(f"No remotes configured for repository {repo_key}, skipping pull") return + self._abort_stuck_rebase(git_repo, repo_key) + # Get the default remote (usually 'origin') origin = ( git_repo.remotes.origin @@ -1108,6 +1125,7 @@ def _pull_from_remote(self, repo_key: str, git_repo: git.Repo): f"Merged remote changes with conflicts resolved for {repo_key}" ) else: + self._abort_stuck_rebase(git_repo, repo_key) raise rebase_error else: # Only behind - fast-forward pull