CI/CD pipeline - get list of changed files

Hi folks,

On my Gitlab CI/CD pipeline, is there a way I can get a list of the changed files?

Basically, I’ve got some linting set up - but the repository contains a number of separate files which don’t work together to form an application, they’re just individual files hosted in the same place.

I’d like to lint only files changed on commit/push. Is this possible?

Many thanks,

1 Like

I have the same question! From what I can tell (below), we’ll have to use the git command: git diff-tree --no-commit-id --name-only -r <commit hash> in our CI scripts to obtain the list of changed files, one per line, and then iterate over that list.

How to get a list of changed files in a commit (GitLab Forum)
How to list all the files in a commit? (Stack Overflow).


Thanks for this @quilty. This worked nicely.

files=(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)

Can then use a standard Bash for loop to iterate through the files.

1 Like

If there are multiple commits in a merge request, how to get all changed files?

1 Like
git diff

Can work with 2 commits SHAs


In case the pipeline runs on merge requests, one option it is to compare it with the target branch.
git diff-tree --name-only --no-commit-id $CI_MERGE_REQUEST_TARGET_BRANCH_SHA

I am running the below command in my pipeline and it throws an error that
git command not found

git diff-tree --no-commit-id --name-only -r

I am trying to capture list of changed files in my pipeline , if there is another way

This command does not work for me.
I get the error fatal: ambiguous argument '{branch_name}': unknown revision or path not in the working tree., even though the merge request originates from this branch.

A quick
git branch -a
* (HEAD detached at b487990)

Which explains why it does not work but I don’t understand why the head is detached in the first place.

FInally found a solution starting from @mpp’s idea, and an answer in this thread:

  1. If this is a private repository, you will need to add a new ssh key in the CI.

  2. Fetch the branch you want to merge:

  3. Compare the current commit with the branch you want to merge with:

Voilà !

1 Like

You saved my life!