From 16274d5a82e92911f31f35d593e21b382d3f246e Mon Sep 17 00:00:00 2001 From: teknium1 Date: Mon, 2 Mar 2026 22:31:42 -0800 Subject: [PATCH] fix: Windows git 'unable to write loose object' + venv pip path - Set 'git config windows.appendAtomically false' in hermes update command (win32 only) and in install.ps1 after cloning. Fixes the 'fatal: unable to write loose object file: Invalid argument' error on Windows filesystems. - Fix venv pip fallback path: Scripts/pip on Windows vs bin/pip on Unix - Gate .env encoding fix behind _IS_WINDOWS (no change to Linux/macOS) --- hermes_cli/main.py | 10 +++++++++- scripts/install.ps1 | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 57ab222b..66e8b9d8 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -789,6 +789,14 @@ def cmd_update(args): print(" curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash") sys.exit(1) + # On Windows, git can fail with "unable to write loose object file: Invalid argument" + # due to filesystem atomicity issues. Set the recommended workaround. + if sys.platform == "win32": + subprocess.run( + ["git", "config", "windows.appendAtomically", "false"], + cwd=PROJECT_ROOT, check=False, capture_output=True + ) + # Fetch and pull try: print("→ Fetching updates...") @@ -832,7 +840,7 @@ def cmd_update(args): env={**os.environ, "VIRTUAL_ENV": str(PROJECT_ROOT / "venv")} ) else: - venv_pip = PROJECT_ROOT / "venv" / "bin" / "pip" + venv_pip = PROJECT_ROOT / "venv" / ("Scripts" if sys.platform == "win32" else "bin") / "pip" if venv_pip.exists(): subprocess.run([str(venv_pip), "install", "-e", ".", "--quiet"], cwd=PROJECT_ROOT, check=True) else: diff --git a/scripts/install.ps1 b/scripts/install.ps1 index b4e9758f..c5c7789e 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -462,9 +462,13 @@ function Install-Repository { } } + # Fix Windows git "unable to write loose object file" error. + # Must be set before any git operations that write objects. + Push-Location $InstallDir + git config windows.appendAtomically false + # Ensure submodules are initialized and updated Write-Info "Initializing submodules (mini-swe-agent, tinker-atropos)..." - Push-Location $InstallDir git submodule update --init --recursive Pop-Location Write-Success "Submodules ready"