Fix git hooks not working in worktrees (#1126)
Git hooks are shared across all worktrees and live in the common git directory (e.g., /repo/.git/hooks), not the worktree-specific directory (e.g., /repo/.git/worktrees/feature/hooks). The core issue was in GetGitHooksDir() which used GetGitDir() instead of GetGitCommonDir(). This caused hooks to be installed to/read from the wrong location when running in a worktree. Additionally, several places in the codebase manually constructed hooks paths using gitDir + "hooks" instead of calling GetGitHooksDir(). These have been updated to use the proper worktree-aware path. Affected areas: - GetGitHooksDir() now uses GetGitCommonDir() - CheckGitHooks() uses GetGitHooksDir() - installHooks/uninstallHooks use GetGitHooksDir() - runChainedHook() uses GetGitHooksDir() - Doctor checks use git-common-dir for hooks paths - Reset command uses GetGitCommonDir() for hooks and beads-worktrees Symptoms that this fixes: - Chained hooks (pre-commit.old) not running in worktrees - bd hooks install not finding/installing hooks correctly in worktrees - bd hooks list showing incorrect status in worktrees - bd doctor reporting incorrect hooks status in worktrees Co-authored-by: Zain Rizvi <4468967+ZainRizvi@users.noreply.github.com>
This commit is contained in:
@@ -118,13 +118,15 @@ func GetGitCommonDir() (string, error) {
|
||||
}
|
||||
|
||||
// GetGitHooksDir returns the path to the Git hooks directory.
|
||||
// This function is worktree-aware and handles both regular repos and worktrees.
|
||||
// This function is worktree-aware: hooks are shared across all worktrees
|
||||
// and live in the common git directory (e.g., /repo/.git/hooks), not in
|
||||
// the worktree-specific directory (e.g., /repo/.git/worktrees/feature/hooks).
|
||||
func GetGitHooksDir() (string, error) {
|
||||
gitDir, err := GetGitDir()
|
||||
commonDir, err := GetGitCommonDir()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return filepath.Join(gitDir, "hooks"), nil
|
||||
return filepath.Join(commonDir, "hooks"), nil
|
||||
}
|
||||
|
||||
// GetGitRefsDir returns the path to the Git refs directory.
|
||||
|
||||
Reference in New Issue
Block a user