Reputation: 7421
During make, I create string fields which I embedded in the linked output. Very useful.
Other than a complex sed
/grep
parsing of the git status
command, how can I easily determine if files in the workspace have been modified according to git
?
Upvotes: 59
Views: 40516
Reputation: 1
An approach with fewer sharp corners:
git diff --quiet HEAD
This appears to do the same thing as the diff-index
answer, but with an advantage: it rebuilds the index if necessary, eliminating some flakiness of diff-index
. Additionally, diff
works correctly when the repository isn't writable by apparently building a temporary index (while diff-index
, if the index is stale, will say everything is modified, and the index can't be updated to fix that).
Upvotes: 0
Reputation: 38324
For git hooks, I found this command useful
git diff-index --exit-code --ignore-submodules HEAD
For example
//run some static analysis check that can change the code
something_changed=`git diff-index --exit-code --ignore-submodules HEAD`
if [ -n "$something_changed" ]
then
echo >&2 "Something changed in $local_ref, not pushing"
exit 1
fi
Upvotes: 6
Reputation: 626
git diff --name-only
does the same (might be more intuitive...)
Upvotes: 5
Reputation: 224699
If you just want a plain “Are there any differences from HEAD?”:
git diff-index --quiet HEAD
If the exit code is 0, then there were no differences.
If you want “What files have changed from HEAD?”:
git diff-index --name-only HEAD
If you want “What files have changed from HEAD, and in what ways have they changed (added, deleted, changed)?”:
git diff-index --name-status HEAD
Add -M
(and -C
) if you want rename (and copy) detection.
These commands will check both the staged contents (what is in the index) and the files in the working tree. Alternatives like git ls-files -m
will only check the working tree against the index (i.e. they will disregard any staged (but uncommitted) content that is also in the working tree).
Upvotes: 98