How to Checkout a Specific Commit Using Ansible?

Managing code versions effectively is crucial in automation workflows. With Ansible’s ansible.builtin.git module, you can checkout a specific commit from a Git repository, ensuring your infrastructure or deployments use the exact version you need.

I’m Luca Berton, and in this tutorial, I’ll guide you through checking out a specific commit of a Git repository using Ansible.

ansible.builtin.git

  • Part of ansible-core
  • Manages Git checkouts
  • Supports branches, tags, and commit hashes

The ansible.builtin.git module enables automated repository management in Ansible playbooks. You can use it to clone repositories, checkout branches, pull changes, and, importantly, checkout a specific commit by using its SHA-1 hash.

Join 50+ hours of courses in our exclusive community

Playbook

I’ll show you how to checkout a specific commit from a Git repository using an Ansible playbook.

Execution

$ ansible-playbook git_checkout_commit.yml

Playbook Code

- name: Checkout a specific commit from a Git repository
  hosts: localhost
  tasks:
    - name: Clone the repo and checkout a specific commit
      ansible.builtin.git:
        repo: "https://github.com/example/repo.git"
        dest: "/path/to/clone"
        version: "abc123def4567890"  # Replace with your commit hash

Explanation:

  • repo: Defines the Git repository URL.
  • dest: Specifies where to clone the repository.
  • version: Points to the exact commit hash to checkout.

Additional Options

Force Checkout a Specific Commit

If the repository is already cloned, but you want to force-checkout a commit:

- name: Force checkout a specific commit
  ansible.builtin.git:
    repo: "https://github.com/example/repo.git"
    dest: "/path/to/clone"
    version: "abc123def4567890"
    force: yes  # Discards any local changes

Checkout a Commit Not Part of a Branch

If the commit isn’t part of any branch or tag, you might need to specify refspec:

- name: Checkout a commit not part of a branch
  ansible.builtin.git:
    repo: "https://github.com/example/repo.git"
    dest: "/path/to/clone"
    version: "abc123def4567890"
    refspec: "+refs/heads/*:refs/remotes/origin/*"

Before Execution

$ ls /path/to/clone
(no repository exists)

After Execution

$ git log --oneline
abc123d (HEAD) Fix critical bug in deployment
456789a Add feature X
7890bcd Initial commit

Handling Detached HEAD State

Since checking out a commit directly places Git in a detached HEAD state, you may want to switch back to a branch after checking out:

    - name: Checkout a branch after commit
      command: git checkout -b feature-branch
      args:
        chdir: "/path/to/clone"

Conclusion

Now you know how to checkout a specific commit of a Git repository using Ansible. This ensures your automation pipelines deploy and test against exact versions.

Subscribe to the YouTube channel, Medium, and Website, X (formerly Twitter) to not miss the next episode of the Ansible Pilot.

Academy

Learn Ansible automation with real-world examples in my
Udemy 300+ Lessons Video Course.

BUY the Complete Udemy 300+ Lessons Video Course

My book Ansible By Examples: 200+ Automation Examples for Linux and Windows System Administrators and DevOps

BUY the Complete PDF BOOK to easily Copy and Paste the 250+ Ansible code

Want to keep this project going? Please donate

Patreon Buy me a Pizza