sds/overcommit · error · Overcommit::Exceptions::GitConfigError

Unable to read from local repo git config: #

Error message

Unable to read from local repo git config: #{result.stderr}

What it means

HookSigner#stored_signature reads the plugin signature with 'git config --local --get overcommit.<HookType>.<Hook>.signature'. Exit status 1 (key absent) is normal and returns an empty string, but any other non-zero exit raises GitConfigError with git's stderr - git could not read or parse the local config at all. This runs on every hook invocation because the runner compares stored and computed signatures.

Solutions

  1. Reproduce with 'git config --local --list' - it names the offending line; fix or remove that line in .git/config
  2. If the file is unfixable, re-create the essentials (remotes, user settings) and re-run 'overcommit --sign' to rewrite the signature keys
  3. Verify you are inside the repo: 'git rev-parse --git-dir' must print a path; re-run hooks from the repo root
  4. Re-run the hook or 'overcommit --sign <hook-type>' once the config parses again

Example fix

# before (.git/config contains)
[core]
    repositoryformatversion <<<<<<< HEAD

# after
[core]
    repositoryformatversion = 0
Defensive patterns

Strategy: validation

Validate before calling

def git_config_parseable?
  system('git', 'config', '--local', '--list', out: File::NULL, err: File::NULL)
end

abort '.git/config is not parseable - fix it before running hooks' unless git_config_parseable?

Try / catch

begin
  runner.run
rescue Overcommit::Exceptions::GitConfigError => e
  warn "Cannot read git config: #{e.message}"
  warn 'Run: git config --local --list  # shows the offending line'
  exit 1
end

Prevention

When it happens

Trigger: git exits non-zero (typically 128) with 'bad config line N in .git/config' (corrupted config or unresolved conflict markers), 'not in a git directory' when run outside a valid work tree, or permission errors reading .git/config.

Common situations: Hand-edited .git/config with a typo; merge/submodule trouble left conflict markers in .git/config; hooks invoked with GIT_DIR pointing at a broken path; CI checkouts where .git is mangled.

Related errors


AI-assisted analysis of sds/overcommit@fee0cd74b2 (2026-08-23). Data as JSON: /api/errors/ae500e44e20b558a. Report an issue: GitHub.

Appendix: source

Thrown at lib/overcommit/hook_signer.rb:113

          hook_contents
        end

      Digest::SHA256.hexdigest(content_to_sign.to_s + hook_config.to_s)
    end

    def hook_contents
      File.read(hook_path)
    end

    def stored_signature
      result = Overcommit::Utils.execute(
        %w[git config --local --get] + [signature_config_key]
      )

      if result.status == 1 # Key doesn't exist
        return ''
      elsif result.status != 0
        raise Overcommit::Exceptions::GitConfigError,
              "Unable to read from local repo git config: #{result.stderr}"
      end

      result.stdout.chomp
    end

    def signature_config_key
      "overcommit.#{@context.hook_class_name}.#{@hook_name}.signature"
    end
  end
end

View on GitHub (pinned to fee0cd74b2)