Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GIT how to get the list of files to be committed with relative path [duplicate]

Tags:

git

git-diff

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
like image 711
Kirby Avatar asked Dec 03 '25 19:12

Kirby


2 Answers

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
like image 118
Joao Delgado Avatar answered Dec 05 '25 15:12

Joao Delgado


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)

like image 37
philb Avatar answered Dec 05 '25 15:12

philb



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!