# What Is the Primary Purpose of the actions/checkout Repository?

> The actions/checkout repository's main goal is to clone your repo code into the GitHub Actions runner's workspace for easy access in workflow steps. Learn more!

- Repository: [GitHub Actions/checkout](https://github.com/actions/checkout)
- Tags: getting-started
- Published: 2026-07-03

---

**The primary purpose of the actions/checkout repository is to provide a GitHub Action that clones repository code into the runner's `$GITHUB_WORKSPACE` directory, enabling subsequent workflow steps to access and operate on the source files.**

The actions/checkout repository is the official GitHub Action for checking out source code within CI/CD workflows. Maintained by GitHub, this repository contains the TypeScript implementation that orchestrates Git operations, handles authentication, and manages the workspace environment. Understanding its primary purpose and internal architecture helps developers optimize their GitHub Actions pipelines and troubleshoot checkout-related issues.

## Core Functionality and Architecture

The action's fundamental role is to prepare the runner's environment by fetching source code from GitHub repositories. According to the source code, this involves executing Git commands or falling back to the GitHub REST API when necessary.

### Repository Cloning into GITHUB_WORKSPACE

By default, the action clones the repository that triggered the workflow into the `$GITHUB_WORKSPACE` directory. As implemented in [`src/main.ts`](https://github.com/actions/checkout/blob/main/src/main.ts) ([source](https://github.com/actions/checkout/blob/main/src/main.ts)), the entry point coordinates input parsing, credential setup, and the checkout execution. The action specifically fetches only the single commit required for the run by default, minimizing network overhead and execution time.

### Git Command Orchestration and API Fallback

The repository implements Git operations through [`src/git-command-manager.ts`](https://github.com/actions/checkout/blob/main/src/git-command-manager.ts) ([source](https://github.com/actions/checkout/blob/main/src/git-command-manager.ts)), which wraps Git CLI commands with retry logic and environment configuration. When Git operations are insufficient or unavailable, the action can utilize the GitHub REST API to fetch repository content, ensuring reliability across diverse runner environments.

## Authentication and Security Mechanisms

Security and credential management are integral to the action's design, not afterthoughts.

### Credential Injection and Cleanup

The [`src/git-auth-helper.ts`](https://github.com/actions/checkout/blob/main/src/git-auth-helper.ts) module ([source](https://github.com/actions/checkout/blob/main/src/git-auth-helper.ts)) manages the injection of **Personal Access Tokens** (PATs) or SSH keys into the local Git configuration. These credentials enable authenticated operations against private repositories. Critically, the action removes these sensitive credentials during the post-job cleanup phase, preventing credential leakage between workflow runs or to subsequent steps.

### Security-First Defaults

The README ([lines 61-71](https://github.com/actions/checkout/blob/main/README.md#checkout-v4)) documents security-focused defaults including persisting credentials in temporary files and refusing unsafe fork PR checkouts. These protections are enforced by the implementation to mitigate common supply chain attack vectors.

## Configuration Options and Advanced Features

While the default behavior covers most use cases, the action provides extensive customization through its [`action.yml`](https://github.com/actions/checkout/blob/main/action.yml) interface ([source](https://github.com/actions/checkout/blob/main/action.yml)).

### Fetch Depth and History Control

Users can control history depth using the `fetch-depth` parameter. Setting `fetch-depth: 0` retrieves the full commit history, while the default shallow fetch optimizes performance for workflows that only need the latest state.

### Sparse Checkout and Submodule Support

Advanced scenarios support **sparse-checkout** patterns to fetch only specific directories, and submodule initialization for repositories with external dependencies. These options allow workflows to minimize checkout time and disk usage for monorepos or large repositories.

## Implementation Details and Key Source Files

The repository structure reflects a clean separation of concerns:

- **[`action.yml`](https://github.com/actions/checkout/blob/main/action.yml)**: Defines inputs, outputs, and the Node.js 20 runtime environment
- **[`src/main.ts`](https://github.com/actions/checkout/blob/main/src/main.ts)**: Entry point that orchestrates the checkout workflow
- **[`src/git-command-manager.ts`](https://github.com/actions/checkout/blob/main/src/git-command-manager.ts)**: Handles Git CLI execution with error handling
- **[`src/git-auth-helper.ts`](https://github.com/actions/checkout/blob/main/src/git-auth-helper.ts)**: Manages authentication state and cleanup
- **[`README.md`](https://github.com/actions/checkout/blob/main/README.md)**: Documents usage patterns and security considerations

## Practical Usage Examples

Basic checkout of the triggering repository:

```yaml
- uses: actions/checkout@v4

```

Checking out a specific branch with full history:

```yaml
- uses: actions/checkout@v4
  with:
    ref: feature/my-branch
    fetch-depth: 0

```

Authenticating with a private repository using a PAT:

```yaml
- uses: actions/checkout@v4
  with:
    repository: my-org/private-repo
    token: ${{ secrets.PAT }}

```

Sparse checkout for specific directories:

```yaml
- uses: actions/checkout@v4
  with:
    sparse-checkout: |
      README.md
      src/
    sparse-checkout-cone-mode: false

```

## Summary

- The actions/checkout repository provides the official GitHub Action for cloning source code into workflow runners
- It orchestrates Git commands via [`src/main.ts`](https://github.com/actions/checkout/blob/main/src/main.ts) and [`src/git-command-manager.ts`](https://github.com/actions/checkout/blob/main/src/git-command-manager.ts), with REST API fallback capabilities
- Security features in [`src/git-auth-helper.ts`](https://github.com/actions/checkout/blob/main/src/git-auth-helper.ts) handle credential injection and cleanup automatically
- Configuration options support shallow clones, sparse checkouts, and submodule initialization
- The action runs on Node.js 20 as defined in [`action.yml`](https://github.com/actions/checkout/blob/main/action.yml)

## Frequently Asked Questions

### What is the primary purpose of actions/checkout in GitHub Actions?

The primary purpose is to clone repository code into the runner's workspace so that subsequent workflow steps can access and modify source files. According to the source code in [`src/main.ts`](https://github.com/actions/checkout/blob/main/src/main.ts), it handles the complete lifecycle from credential setup through Git execution to post-job cleanup.

### How does actions/checkout handle authentication for private repositories?

The action accepts Personal Access Tokens or SSH keys through its inputs, which [`src/git-auth-helper.ts`](https://github.com/actions/checkout/blob/main/src/git-auth-helper.ts) injects into the Git configuration temporarily. These credentials are automatically removed during the post-job cleanup phase to prevent security exposure.

### What is the difference between fetch-depth: 1 and fetch-depth: 0?

By default (`fetch-depth: 1`), the action performs a shallow clone fetching only the latest commit, optimizing for speed and storage. Setting `fetch-depth: 0` retrieves the complete Git history, which is necessary for operations like changelog generation or deep analysis of commit relationships.

### Can actions/checkout handle repositories with submodules?

Yes, the action supports submodule checkout through the `submodules` input parameter. When enabled, it recursively initializes and updates submodules, leveraging the same Git command management infrastructure in [`src/git-command-manager.ts`](https://github.com/actions/checkout/blob/main/src/git-command-manager.ts) used for the primary repository.