(git) diff output relative path?

15,068

Solution 1

Seems like --src-prefix and --dst-prefix are what you're asking for:

$ cd .../git/builtin
$ ed - var.c << end
> 0a
> xxx
> .
> wq
> end
$ git diff
diff --git a/builtin/var.c b/builtin/var.c
index aedbb53..5210013 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -1,3 +1,4 @@
+xxx
 /*
  * GIT - The information manager from hell
  *

(so far, pretty standard; now:)

$ git diff --src-prefix=a/new/ --dst-prefix=b/new/
diff --git a/new/builtin/var.c b/new/builtin/var.c
index aedbb53..5210013 100644
--- a/new/builtin/var.c
+++ b/new/builtin/var.c
@@ -1,3 +1,4 @@
+xxx
 /*
  * GIT - The information manager from hell
  *

You can combine this with --relative:

$ git diff --relative --src-prefix=a/new/ --dst-prefix=b/new/
diff --git a/new/var.c b/new/var.c
index aedbb53..5210013 100644
--- a/new/var.c
+++ b/new/var.c
@@ -1,3 +1,4 @@
+xxx
 /*
  * GIT - The information manager from hell
  *
$ 

Solution 2

git diff prints paths (of changed files) from the root of the repo - no matter where you are when executing the command.

git diff --relative will print paths from the dir you are in.

So if you need paths not starting from the repo-root move down (cd) to the directory (within your repo tree) where you with your paths to start from.

Share:
15,068

Related videos on Youtube

user318904
Author by

user318904

Updated on June 16, 2022

Comments

  • user318904
    user318904 almost 2 years

    I need to get some diffs in my repo that are not relative to the base of the repo, but instead relative to a given base or given path.

    By default I get:

    git diff
    diff --git a/path/to/file b/path/to/file
    index 0cc125e..9bf911e 100644
    --- a/path/to/file
    +++ b/path/to/file
    

    But what I want is something like:

    git diff --prefix=/new/path/to
    diff --git a/new/path/to/file b/new/path/to/file
    index 0cc125e..9bf911e 100644
    --- a/new/path/to/file
    +++ b/new/path/to/file
    

    I have looked over the --relative option (not what I am looking for), the --src/dst-prefix (these can only change the "a" or "b" parts. Am I missing something basic?

    • Anshul Goyal
      Anshul Goyal about 10 years
      Are they both relative to some part of repo? if not, why not use vimdiff or meld instead?
  • user318904
    user318904 about 10 years
    I think this is correct, I never thought to try both of them of course..I hate porting patches.
  • Lilás
    Lilás over 6 years
    --relative was exactly what I needed when I was using git diff --name-only, thanks
  • Andy Stewart
    Andy Stewart almost 4 years
    --relative excludes changes outside the current directory.
  • Antarctica
    Antarctica over 3 years
    You seem to have an in-depth knowledge of git (I read some your answers). Do you have some resources to recommend?
  • torek
    torek over 3 years
    @Antarctica: I've been using (and recently, contributing slightly to) Git for well over a decade. I don't have any single thing I'd specifically recommend at this point, but if you're looking for a decent book on Git, the Pro Git book has a bunch of plus-es: it's on line and kept up to date, it's free, and it's correct (unlike far too many online tutorials). There is also Think Like (a) Git, which covers most of what's missing from Pro Git.
  • Robert
    Robert almost 2 years
    You can make relative paths the default with git config --global diff.relative true for all your repositories; drop the --global to only use it for the current repository.