fix(sync): add --sparse flag to git add for worktree compatibility (#1143)
Fixes #1076. When git worktrees have sparse-checkout enabled, git add operations can fail with 'outside of sparse-checkout cone' errors. Adding the --sparse flag allows git to stage files outside the sparse-checkout cone. Changes: - Add --sparse flag to git add in daemon_sync_branch.go (line 165) - Add --sparse flag to git add in migrate_sync.go (line 343) - Add --sparse flag to git add in sync_branch.go (line 308) - Add --sparse flag to git add in worktree.go (line 732) All changes include comments referencing #1076 for traceability.
This commit is contained in:
@@ -161,7 +161,8 @@ func gitCommitInWorktree(ctx context.Context, worktreePath, filePath, message st
|
||||
}
|
||||
|
||||
// Stage the file
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", worktreePath, "add", relPath) // #nosec G204 - worktreePath and relPath are derived from trusted git operations
|
||||
// Use --sparse to work correctly with sparse-checkout enabled worktrees (fixes #1076)
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", worktreePath, "add", "--sparse", relPath) // #nosec G204 - worktreePath and relPath are derived from trusted git operations
|
||||
if err := addCmd.Run(); err != nil {
|
||||
return fmt.Errorf("git add failed in worktree: %w", err)
|
||||
}
|
||||
|
||||
@@ -339,7 +339,8 @@ func commitInitialSyncState(ctx context.Context, worktreePath, jsonlRelPath stri
|
||||
beadsRelDir := filepath.Dir(jsonlRelPath)
|
||||
|
||||
// Stage all beads files
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", worktreePath, "add", beadsRelDir)
|
||||
// Use --sparse to work correctly with sparse-checkout enabled worktrees (fixes #1076)
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", worktreePath, "add", "--sparse", beadsRelDir)
|
||||
if err := addCmd.Run(); err != nil {
|
||||
return fmt.Errorf("git add failed: %w", err)
|
||||
}
|
||||
|
||||
@@ -304,7 +304,8 @@ func commitToExternalBeadsRepo(ctx context.Context, beadsDir, message string, pu
|
||||
relBeadsDir = beadsDir // Fallback to absolute path
|
||||
}
|
||||
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", repoRoot, "add", relBeadsDir) //nolint:gosec // paths from trusted sources
|
||||
// Use --sparse to work correctly with sparse-checkout enabled worktrees (fixes #1076)
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", repoRoot, "add", "--sparse", relBeadsDir) //nolint:gosec // paths from trusted sources
|
||||
if output, err := addCmd.CombinedOutput(); err != nil {
|
||||
return false, fmt.Errorf("git add failed: %w\n%s", err, output)
|
||||
}
|
||||
|
||||
@@ -728,7 +728,8 @@ func commitInWorktree(ctx context.Context, worktreePath, jsonlRelPath, message s
|
||||
|
||||
// Use -f (force) to add files even if they're gitignored
|
||||
// In contributor mode, .beads/ is excluded in .git/info/exclude but needs to be tracked in sync branch
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", worktreePath, "add", "-f", beadsRelDir)
|
||||
// Use --sparse to work correctly with sparse-checkout enabled worktrees (fixes #1076)
|
||||
addCmd := exec.CommandContext(ctx, "git", "-C", worktreePath, "add", "-f", "--sparse", beadsRelDir)
|
||||
if err := addCmd.Run(); err != nil {
|
||||
return fmt.Errorf("git add failed in worktree: %w", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user