Fix migrate sync failing in git worktree environments (#970)
Two issues caused `bd migrate sync` to fail when run from a git worktree:
1. Used GetGitDir() instead of GetGitCommonDir() for worktree path
- GetGitDir() returns the worktree-specific path (.bare/worktrees/main)
- GetGitCommonDir() returns the shared git dir (.bare) where new
worktrees can actually be created
2. Used strings.Index instead of LastIndex in GetRepoRoot()
- When user paths contain "worktrees" (e.g., ~/Development/worktrees/),
Index finds the first occurrence and incorrectly strips the path
- LastIndex finds git's internal /worktrees/ directory
Added GetGitCommonDir() to internal/git/gitdir.go for reuse.
Fixes GH#639 (remaining unfixed callsite in migrate_sync.go)
This commit is contained in:
@@ -100,6 +100,23 @@ func GetGitDir() (string, error) {
|
||||
return ctx.gitDir, nil
|
||||
}
|
||||
|
||||
// GetGitCommonDir returns the common git directory shared across all worktrees.
|
||||
// For regular repos, this equals GetGitDir(). For worktrees, this returns
|
||||
// the main repository's .git directory where shared data (like worktree
|
||||
// registrations, hooks, and objects) lives.
|
||||
//
|
||||
// Use this instead of GetGitDir() when you need to create new worktrees or
|
||||
// access shared git data that should not be scoped to a single worktree.
|
||||
// GH#639: This is critical for bare repo setups where GetGitDir() returns
|
||||
// a worktree-specific path that cannot host new worktrees.
|
||||
func GetGitCommonDir() (string, error) {
|
||||
ctx, err := getGitContext()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return ctx.commonDir, nil
|
||||
}
|
||||
|
||||
// GetGitHooksDir returns the path to the Git hooks directory.
|
||||
// This function is worktree-aware and handles both regular repos and worktrees.
|
||||
func GetGitHooksDir() (string, error) {
|
||||
|
||||
Reference in New Issue
Block a user