GitBor

Диагностика

Типовые проблемы и способы их решить

Если что-то пошло не так — сначала загляните в Git Activity Log (индикатор в title bar показывает количество текущих операций). Там видно последние git-вызовы, их stdout/stderr и exit-код.

Git Activity Log

Per-repo журнал, хранит последние 100 записей. Каждая запись:

  • Сырая команда (git log --oneline ...).
  • stdout / stderr (truncated до 16 KiB с маркером [truncated...]).
  • Exit-код.
  • Длительность в мс.

activityContext.ts через AsyncLocalStorage автоматически связывает каждый GitExecutor.exec с операцией, в рамках которой он был запущен — без ручной передачи id.

Логирование

Двусторонняя система: и main, и renderer пишут логи только в dev-режиме. В production консоль молчит (это сделано специально, чтобы не раскрывать пути и SHA в DevTools пользователя).

  • Main — singleton mainLogger с уровнями silent / error / warn / info / debug. По умолчанию silent если app.isPackaged === true. Переопределить можно env-переменной GITBOR_LOG_LEVEL=debug — без пересборки.
  • Renderer — префикс [GitBor]. В production-сборке Vite методы — no-op (import.meta.env.DEV === false).
  • Performance perf-логи — отдельный модуль perf.ts, включается через GITBOR_PERF=1 или window.__GITBOR_PERF__ = true.

Типовые проблемы

Не открывается репозиторий, ошибка про опасный корень

Если выбранный путь — это $HOME, корень диска, C:\Windows, Program Files или node_modules, file watcher не запустится: isDangerousRepoRoot() подавляет chokidar, чтобы не получить лавину EPERM. Сам репозиторий откроется, но автоматическое обновление при изменениях файлов работать не будет — обновляйте вручную F5.

Граф коммитов долго строится

Большие репозитории (десятки тысяч коммитов) уходят на WorkerPool (порог 2000 коммитов для layout, 512 KB для парсинга git log). Если граф очень долгий — проверьте, не идёт ли параллельно git fetch, и подождите. Дальнейшие переключения на эту вкладку будут мгновенными — layout кэшируется в GraphCache.

Операция «зависла» с кнопкой Cancel

Все долгие IPC-операции имеют requestId и AbortController. Кнопка Cancel посылает abort, и на стороне main процесс убивается через SIGTERM (через OperationQueue.release(repoPath)). Если SIGTERM не подействовал за timeout — будет SIGKILL.

Stale .git/index.lock

Если GitBor падал во время операции, в .git/ мог остаться lock-файл. GitBor не удаляет его на старте автоматически (это могло бы сломать параллельный git). Вместо этого RecoveryManager помечает lock как stale и игнорирует при чтении состояния. Если он реально мешает — удалите вручную: rm .git/index.lock.

Не сохраняется AI-ключ

AiConfigStore пытается зашифровать ключ через Electron safeStorage (DPAPI / Keychain / libsecret). Если key store недоступен (например, headless Linux без libsecret), ключ сохраняется с префиксом plain: — он будет работать, но без шифрования. Проверить можно содержимое {userData}/ai-config.json — если ключ начинается с plain:, шифрование не сработало.

Renderer завис / белый экран

React ErrorBoundary перехватывает unhandled UI-ошибки и показывает экран «Something went wrong» с кнопкой Reload. Если он не сработал — Ctrl+R перезагрузит renderer.

Порт 5188 занят (только в dev)

npm run dev поднимает Vite на порту 5188. Если он занят — задайте свой через env: VITE_DEV_PORT=5189 npm run dev.

TODO: добавить раздел «Совместимость с Git For Windows / WSL».