git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Bug in git log

From
Linus Torvalds <torvalds@osdl.org>
Date
May 2, 2006, 15:26 UTC
Message-ID
<Pine.LNX.4.64.0605020817060.4086@g5.osdl.org>
In-Reply-To
<20060502134158.GC4592@spinlock.ch>
On Tue, 2 May 2006, Matthias Kestenholz wrote:
> 
> The "double dash" problem is not a big deal since it only happens
> with the deprecated shellscript-version of whatchanged.
Simple enough to fix. Appended.

The problem was that "git-rev-parse --no-flags --no-revs" will show _just_ the filenames from the argument list. That means that it will also remove the "--" from the original. That's all well and proper, but git-whatchanged had a bug, and it wouldn't separate the filename arguments from the flags by adding its own "--".

That bug didn't matter back when we didn't check the parsing all that carefully. It does now.

> Does anyone get some output with the following command? That was the
> bug I tried to report (sorry for my bad/convoluted english)
> 
> $ git log -- unresolve.c
Now, this returns empty, and it actually does that for a reason.

Along the main path, "unresolve.c" has never existed. The modern "git-whatchanged" (and "git log") is a bit different from the old big-whatchanged.

The old git-whatchanged would go through _every_ commit, because it literally did

	git-rev-list | git-diff-tree --stdin -- <paths>

and thus the revision list was generated without _any_ regard for the paths - and every single commit shows up, whether it is relevant or not.

The new revision is based on the revision parsing thing, and the semantics are a bit different: it semantically does the equivalent of

	git-rev-list <paths> | git-diff-tree --stdin -- <paths>
which limits the revision list too on the paths.
And yes, "git log" does the same.

See the discussion a few weeks ago about "path limiting broken", and my patch that suggested a "--no-prune-merges" flag:

	http://www.gelato.unsw.edu.au/archives/git/0604/19180.html
which gives more of an explanation.
		Linus
--
diff --git a/git-whatchanged.sh b/git-whatchanged.sh
index 1fb9feb..bb73cff 100755
--- a/git-whatchanged.sh
+++ b/git-whatchanged.sh
@@ -24,5 +24,5 @@ rev_list_args=$(git-rev-parse --sq --def
 diff_tree_args=$(git-rev-parse --sq --no-revs --no-flags "$@") &&
 
 eval "git-rev-list $count $rev_list_args" |
-eval "git-diff-tree --stdin --pretty -r $diff_tree_flags $diff_tree_args" |
+eval "git-diff-tree --stdin --pretty -r $diff_tree_flags -- $diff_tree_args" |
 LESS="$LESS -S" ${PAGER:-less}
Previous: Matthias Kestenholz
Message 4 of 4 in “Bug in git log”
  1. Matthias KestenholzMay 2, 2006
  2. Junio C HamanoMay 2, 2006
  3. Matthias KestenholzMay 2, 2006
  4. Linus TorvaldsMay 2, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.