diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3aa5fc9..fe2539f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -165,6 +165,22 @@ jobs: - name: Verify submodules recursive run: __test__/verify-submodules-recursive.sh + # Worktree credentials + - name: Checkout for worktree test + uses: ./ + with: + path: worktree-test + - name: Verify worktree credentials + shell: bash + run: __test__/verify-worktree.sh worktree-test worktree-branch + + # Worktree credentials in container step + - name: Verify worktree credentials in container step + if: runner.os == 'Linux' + uses: docker://bitnami/git:latest + with: + args: bash __test__/verify-worktree.sh worktree-test container-worktree-branch + # Basic checkout using REST API - name: Remove basic if: runner.os != 'windows' diff --git a/__test__/verify-worktree.sh b/__test__/verify-worktree.sh new file mode 100755 index 0000000..3a4d3e4 --- /dev/null +++ b/__test__/verify-worktree.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -e + +# Verify worktree credentials +# This test verifies that git credentials work in worktrees created after checkout +# Usage: verify-worktree.sh + +CHECKOUT_PATH="$1" +WORKTREE_NAME="$2" + +if [ -z "$CHECKOUT_PATH" ] || [ -z "$WORKTREE_NAME" ]; then + echo "Usage: verify-worktree.sh " + exit 1 +fi + +cd "$CHECKOUT_PATH" + +# Add safe directory for container environments +git config --global --add safe.directory "*" 2>/dev/null || true + +# Show the includeIf configuration +echo "Git config includeIf entries:" +git config --list --show-origin | grep -i include || true + +# Create the worktree +echo "Creating worktree..." +git worktree add "../$WORKTREE_NAME" HEAD --detach + +# Change to worktree directory +cd "../$WORKTREE_NAME" + +# Verify we're in a worktree +echo "Verifying worktree gitdir:" +cat .git + +# Verify credentials are available in worktree by checking extraheader is configured +echo "Checking credentials in worktree..." +if git config --list --show-origin | grep -q "extraheader"; then + echo "Credentials are configured in worktree" +else + echo "ERROR: Credentials are NOT configured in worktree" + echo "Full git config:" + git config --list --show-origin + exit 1 +fi + +# Verify fetch works in the worktree +echo "Fetching in worktree..." +git fetch origin + +echo "Worktree credentials test passed!" diff --git a/dist/index.js b/dist/index.js index a251a19..b9b34d3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -412,6 +412,9 @@ class GitAuthHelper { // Configure host includeIf const hostIncludeKey = `includeIf.gitdir:${gitDir}.path`; yield this.git.config(hostIncludeKey, credentialsConfigPath); + // Configure host includeIf for worktrees + const hostWorktreeIncludeKey = `includeIf.gitdir:${gitDir}/worktrees/*.path`; + yield this.git.config(hostWorktreeIncludeKey, credentialsConfigPath); // Container git directory const workingDirectory = this.git.getWorkingDirectory(); const githubWorkspace = process.env['GITHUB_WORKSPACE']; @@ -424,6 +427,9 @@ class GitAuthHelper { // Configure container includeIf const containerIncludeKey = `includeIf.gitdir:${containerGitDir}.path`; yield this.git.config(containerIncludeKey, containerCredentialsPath); + // Configure container includeIf for worktrees + const containerWorktreeIncludeKey = `includeIf.gitdir:${containerGitDir}/worktrees/*.path`; + yield this.git.config(containerWorktreeIncludeKey, containerCredentialsPath); } }); } diff --git a/src/git-auth-helper.ts b/src/git-auth-helper.ts index a1950a6..e67db14 100644 --- a/src/git-auth-helper.ts +++ b/src/git-auth-helper.ts @@ -374,6 +374,10 @@ class GitAuthHelper { const hostIncludeKey = `includeIf.gitdir:${gitDir}.path` await this.git.config(hostIncludeKey, credentialsConfigPath) + // Configure host includeIf for worktrees + const hostWorktreeIncludeKey = `includeIf.gitdir:${gitDir}/worktrees/*.path` + await this.git.config(hostWorktreeIncludeKey, credentialsConfigPath) + // Container git directory const workingDirectory = this.git.getWorkingDirectory() const githubWorkspace = process.env['GITHUB_WORKSPACE'] @@ -395,6 +399,13 @@ class GitAuthHelper { // Configure container includeIf const containerIncludeKey = `includeIf.gitdir:${containerGitDir}.path` await this.git.config(containerIncludeKey, containerCredentialsPath) + + // Configure container includeIf for worktrees + const containerWorktreeIncludeKey = `includeIf.gitdir:${containerGitDir}/worktrees/*.path` + await this.git.config( + containerWorktreeIncludeKey, + containerCredentialsPath + ) } }