Is there a way to list only the directories that were changed?
If I'm at the git root say, ~/project
Files I changed are
~/project/subtool/file1
~/project/subtool/file2
~/project/subtool3/file1
I just want
~/project/subtool
~/project/subtool3
You could use git-diff with the --dirstat parameter.
In your scenario, let's say you have the following commit:
$ git diff --name-status HEAD~1
M subtool/file1
M subtool/file2
M subtool3/file1
It would produce the following output:
$ git diff --dirstat=files,0 HEAD~1
66.6% subtool/
33.3% subtool3/
Make sure to add ,0, otherwise git diff will by default only show directories with at least 3% changes. I also chose files as this is the computationally cheapest option and you do not seem to care about specific changes anyway.
If you are able to use sed you can get rid of the percentage values (you may want to tweak the regular expression a bit to fit your needs):
$ git diff --dirstat=files,0 HEAD~1 | sed 's/^[ 0-9.]\+% //g'
subtool/
subtool3/
git diff-tree is built for that. doit() { git diff-tree "$@" | awk '$1$2~/04/' | cut -f2-; }-E flag to the sed command and remove the forward slash from \+. This is what I used: sed -E 's/^[ 0-9.]+% //g'sed command, you can remove all the sub-folder names so you only have the top-level folders. git diff --dirstat=files,0 HEAD~1 | sed -E 's/^[ 0-9.]+% //g' | sed -E 's/\/.*$//g'this solution works also for files in the root directory:
git diff --name-only HEAD~1 | awk -F "/*[^/]*/*$" '{ print ($1 == "" ? "." : $1); }' | sort | uniq
Changes in root directory will be listed as .
The limitation of git diff --dirstat=files,0 HEAD~1 is that it doesn't show changes in the root directory.
Here's an alternative using xargs and dirname instead of anything like sed or awk.
git diff HEAD~1 --name-only | xargs dirname | sort | uniq
git diff … will list modified file paths.| xargs dirname will convert file paths into dir paths.| sort | uniq will remove duplicates.Note that this will produce a . line if you modified any files in your repo root directory.
After adding split and uniq option from @Lari Hotari answer. One can get unique directories that are modified.
$(git diff --name-only HEAD~1 | awk -F "/*[^/]*/*$" '{ print ($1 == "" ? "." : $1); }' | cut -d "/" -f 1 | sort | uniq)
What this command does?
This command will monitor all the changes of sub-projects in monorepo and can install dependencies only for the changed workspaces using npm i -ws command
git diff --name-only | cut -d/ -f1 | uniq gives you also the root dir of changed modules.