Jon49
Jon49

Reputation: 4606

Determine If Any File Changed In Directory For Latest Git Commit

I'm writing a post-commit hook for git. I would like to know if the latest commit changed any of the files in a particular directory. If there were any changes I can then proceed and call some expensive code, otherwise I can just skip it.

So, far I'm getting the short hash like so:

# get last commit hash prepended with @ (i.e. @8a323d0)
function parse_git_hash() {
  git rev-parse --short HEAD 2> /dev/null | sed "s/\(.*\)/@\1/"
}

Now, I need to determine if there were any changes to the specified directory. But I'm not sure how to go about that. I've looked at and played with git-log and git-show but without success so far.

So, I need to do something like this.

if [directory-changed()] {
  echo "start expensive operation"
}

This actually gets me part way there: Actually it grabs the last commit not the one specified.

git log  -U a79851b -1 my/directory/path

Thanks in advance.

Upvotes: 11

Views: 17267

Answers (2)

Tinkaal Gogoi
Tinkaal Gogoi

Reputation: 4898

A modified version of the script with arguments would be:

#!/bin/bash

git diff --name-only --diff-filter=ADMR @~..@ | grep -q $1
retVal=$?

echo "git command retVal : ${retVal}"
if [ $retVal -eq 0 ]; then
  echo "folder/file : $1 changed"
else
  echo "no match found for the folder/file : $1"
  exit $retVal
fi

Upvotes: 1

janos
janos

Reputation: 124794

You can get the added, modified, deleted and renamed files in the latest commit with:

git diff --name-only --diff-filter=AMDR --cached @~..@

To get the changes affecting a specific directory, filter the output using grep. For example:

changes() {
  git diff --name-only --diff-filter=AMDR --cached @~..@
}

if changes | grep -q dirname {
  echo "start expensive operation"
}

Upvotes: 13

Related Questions