Диагностика
Типовые проблемы и способы их решить
Если что-то пошло не так — сначала загляните в 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».