Reputation: 9373
I am trying to create a string array of my modified git files so I can use them in a bash program. Sample output:
On branch restructured
Your branch is up-to-date with 'origin/restructured'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: path/to/file1
modified: path/to/file2
I'm tryig to grab the text after modified:
but from what I've found grep doesn't support new line so i'm at a loss how I could convert the raw output into something I could work with.
Upvotes: 4
Views: 7127
Reputation: 77197
If you really just want a list of modified files, consider git ls-files -m
. If you need something extensible to potentially other types of changes:
git status --porcelain | while read -r status file; do
case "$status" in
M) printf '%s\n' "$file";;
esac
done
Upvotes: 8
Reputation: 3643
You are looking at the problem wrong.
Git "status" is a pretty view derived from a number of underlying commands.
The list of "changed" files is retrieved with
$ git diff --name-only --diff-filter=M
modifiedfile.txt
diff-filter can be:
You can also try ls-files which supports -d, -m, -a, and -o.
If you are looking for NEW files which are not yet tracked, you can try
$ git ls-files -o
untrackedfile.txt
As a last resort, if you really insist on trying to parse the output from git-status, consider using the '--short' or '--porcelain' output option. --short produces coloured output, which --porcelain avoids.
$ git status --short
M modifiedfile.txt
?? untrackedfile.txt
Upvotes: 2
Reputation: 39494
How about:
files=(git status | grep '^\s*modified:' | cut -f 2- -d :)
Reading from inside out, that:
git
status to grep
, whichmodified:
on them singularly, then$files
Upvotes: 4