Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

git log -L without diff

Tags:

git

git-log

I'm trying to use git log -L <start>,<end>:<filename> but I would like to have very limited output (actually just hashes). While --pretty prints the commit info in the format I want, I did not find a way to not display the diff...

e.g. on linux-next what I tried is:

git log --pretty=format:"%H" -s -L 70,70:./arch/x86/include/asm/irqflags.h

where (according to the manpage) the -s is supposed to Supress the ouput of the diff, however the output is:

$ git log --pretty=format:"%H" -s -L 70,70:./arch/x86/include/asm/irqflags.h
6abcd98ffafbff81f0bfd7ee1d129e634af13245
diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h
--- a/include/asm-x86/irqflags.h
+++ b/include/asm-x86/irqflags.h
@@ -1,2 +64,1 @@
-#ifdef CONFIG_X86_32
-# include "irqflags_32.h"
+{

96a388de5dc53a8b234b3fd41f3ae2cedc9ffd42
diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h
--- /dev/null
+++ b/include/asm-x86/irqflags.h
@@ -0,0 +1,2 @@
+#ifdef CONFIG_X86_32
+# include "irqflags_32.h"

I am using git version 2.10.2

like image 713
andipla Avatar asked Jan 02 '17 13:01

andipla


People also ask

How do I see diff in git log?

Regular git log -p -- A will show all commits that touch file A, and for those commits, it'll show the diffs to A. With --full-diff , it'll show the same commits, but for each commit it'll show the diff of all files changed in that commit. In this case, commit C's diff will show diffs for files A and B.

What is git log -- Oneline?

Git Log Oneline The oneline option is used to display the output as one commit per line. It also shows the output in brief like the first seven characters of the commit SHA and the commit message.

Does git log show all branches?

Many times it's useful to know which branch or tag each commit is associated with. The --decorate flag makes git log display all of the references (e.g., branches, tags, etc) that point to each commit.

How do I search for a string in git log?

Simply run git log with the -L option, and it will show you the history of a function or line of code in your codebase.


3 Answers

That will be clearer with Git 2.22 (Q2 2019).

"git log -L<from>,<to>:<path>" with "-s" did not suppress the patch output as it should.
This has been corrected.

See commit 05314ef (11 Mar 2019), and commit 9f607cd (07 Mar 2019) by Jeff King (peff).
(Merged by Junio C Hamano -- gitster -- in commit 31df2c1, 09 Apr 2019)

line-log: detect unsupported formats

If you use "log -L" with an output format like "--raw" or "--stat", we'll silently ignore the format and just output the normal patch.
Let's detect and complain about this, which at least tells the user what's going on.

It will now clearly display:

-L does not yet support diff formats besides -p and -s

With Git 2.25 (Q1 2020), the documentation adds more.

See commit 2be4586, commit 2be4586 (26 Dec 2019) by Philippe Blain (phil-blain).
(Merged by Junio C Hamano -- gitster -- in commit c4117fc, 06 Jan 2020)

doc: log, gitk: document accepted line-log diff formats

Currently the line-log functionality (git log -L) only supports displaying patch output (-p | --patch, its default behavior) and suppressing it (-s | --no-patch).
A check was added in the code to that effect in 05314ef (line-log: detect unsupported formats, 2019-03-10) but the documentation was not updated.

Explicitly mention:

  • that -L implies -p, that patch output can be suppressed using -s,
  • and that all other diff formats are not allowed.

And:

The line number, regex or offset parameters and in git log -L <start>,<end>:<file>, or the function name regex in git log -L :<funcname>:<file> must exist in the starting revision, or else the command exits with a fatal error.

So, in addition of You can specify this option more than once, you have:

Implies --patch.
Patch output can be suppressed using --no-patch, but other diff formats (namely --raw, --numstat, --shortstat, --dirstat, --summary, --name-only, --name-status, --check) are not currently implemented.


With Git 2.30 (Q1 2021), "git log(man)" is documented to take no pathspec, but this was not enforced by the command line option parser, which has been corrected.

See commit 39664cb (04 Nov 2020) by Junio C Hamano (gitster).
(Merged by Junio C Hamano -- gitster -- in commit f8a1cee, 18 Nov 2020)

log: diagnose -L used with pathspec as an error

Heled-by: Jeff King

The -L option is documented to accept no pathspec, but the command line option parser has allowed the combination without checking so far.
Ensure that there is no pathspec when the -L option is in effect to fix this.

Incidentally, this change fixes another bug in the command line option parser, which has allowed the -L option used together with the --follow option.
Because the latter requires exactly one path given, but the former takes no pathspec, they become mutually incompatible automatically.
Because the -L option follows renames on its own, there is no reason to give --follow at the same time.

The new tests say they may fail with "-L and --follow being incompatible" instead of "-L and pathspec being incompatible". Currently, the expected failure can come only from the latter, but this is to future-proof them, in case we decide to add code to explicitly die on -L and --follow used together.

like image 92
VonC Avatar answered Nov 07 '22 13:11

VonC


Update: Git version 2.22 and later now supports mixing -L with -s. See VonC's answer.


The -L option is not currently (and apparently never was) compatible with -s / --no-patch, because of this code called from line_log_print, called from the top of log_tree_commit when -L is in effect. Said code simply outputs the entire chosen line-range from any matched commit. (You could patch the hack to obey the diff output options, perhaps.)

(The other obvious workaround would be to use git rev-list instead of git log, except that -L is, as that first link notes, not properly integrated in the first place, so that git rev-list does not handle it.)

like image 32
torek Avatar answered Nov 07 '22 14:11

torek


one grep solution is to pipe the output to grep to only print lines matching a commit:

git log -L 10,11:example.txt | grep 'commit \w' -A 4

grep matches the first line of each log entry and the prints the next 4 lines with the -A flag

It's a bit verbose though. Would love to hear if anyone has a better solution!

like image 1
stu0292 Avatar answered Nov 07 '22 13:11

stu0292