Reputation: 3107
It works in this way:
MYPC /d/home/project/some/path (master)
$ git diff --name-only --cached
root.txt
some/path/relative.txt
I.e. it shows path from the GIT root, but I need relative paths from current directory.
Expected result :
$ git diff --name-only --cached --AND_SOME_OPTION
../../root.txt
relative.txt
In common sense, it should work like git status
.
P.S.
The --relative
option doesn't work because it will show files from this directory.
In our example it will show only relative.txt
.
P.P.S
Using --git-dir
doesn't work as well:
$ git --git-dir=$(git rev-parse --show-toplevel)/.git diff --cached --name-only
root.txt
some/path/relative.txt
Upvotes: 10
Views: 3478
Reputation: 2970
Building on Joao Delgado suggestion above to use realpath
, you can trick Git into doing what you want using --src-prefix
and --dst-prefix
:
$ rel=$(realpath --relative-to=. $(git rev-parse --show-toplevel))
$ git diff --src-prefix=a/$rel/ --dst-prefix=b/$rel/
../../root.txt
../../some/path/relative.txt
This will show all modified files (not just those in the current working directory), and it will also use relative paths in the output (for all files though).
Note that at the toplevel this will output paths with a leading ./
:
./root.txt
./some/path/relative.txt
Here is how to configure a df
alias:
$ git config --global alias.df '!f() { : git diff ; rel=$(realpath --relative-to="$PWD/$GIT_PREFIX" "$PWD"); git diff --src-prefix="a/$rel/" --dst-prefix="b/$rel/" "$@"; }; f'
$ git df
../../root.txt
../../some/path/relative.txt
(this uses the null command :
to enable git diff
Bash completion for this alias (see https://github.com/git/git/blob/1a4874565fa3b6668042216189551b98b4dc0b1b/contrib/completion/git-completion.bash#L26-L30)
Upvotes: 1
Reputation: 3107
So far, I didn't find a way to use relative paths by using git-diff
.
The only way work for me:
$ git status -s | awk '{print $2}'
../../root.txt
relative.txt
Or
$ git status -s | cut -c4-
The last approach explained in How can I run "git status" and just get the filenames. . The first one quite similar. :)
But it'd be good to find non-pipeline way. Seem, there is no way to avoid using --cached
.
So, mostly it's not an answer.
Upvotes: 0
Reputation: 856
git status -s
already outputs relative paths that can be easily isolated.
If you need to use git diff
, you can pipe the output to realpath
, if available:
$ git diff --name-only | \
xargs -I '{}' realpath --relative-to=. $(git rev-parse --show-toplevel)/'{}'
../../root.txt
relative.txt
Upvotes: 10