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

Re: "git add -u" broken in git 1.7.4?

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Feb 8, 2011, 10:05 UTC
Message-ID
<20110208100518.GA9505@neumann>
In-Reply-To
<20110207195035.GA13461@sigill.intra.peff.net>
On Mon, Feb 07, 2011 at 02:50:35PM -0500, Jeff King wrote:
Show 24 quoted lines
> On Sun, Feb 06, 2011 at 10:46:20PM -0800, Junio C Hamano wrote:
> 
> > I actually do not mind too much myself if all commands that can take
> > pathspecs consistently defaulted to "full-tree" pathspec given no
> > pathspec.  But if we were to go that route, everybody should join their
> > voice to defend that decision when outside people say "in 1.8.0 'git grep'
> > run from a subdirectory shows matches from all the irrelevant parts of the
> > tree; with all the cruft its output is unreadable". I won't be the sole
> > champion of such a behaviour when I do not fully believe in it.
> 
> The problem is that I don't feel comfortable writing an RFC that says
> "in 1.8.0 we will default to full-tree because it is somehow better".
> Because I don't think it is better; it is simply a different way of
> thinking about it, and different people will have different preferences.
> 
> I think even the same people may different preferences from project to
> project. For most of my projects, the scope of the repo is well-defined,
> and I want full-tree semantics (e.g., I hack on a bug, go into t/ to
> tweak and run the tests, and then want to "git add -u" the whole thing
> when everything looks good). But I also recently worked on a gigantic
> project that was split into several sub-components. I would cd 3 or 4
> levels deep into the sub-component that I was working on, and I would
> prefer my "git add -u" to stay in that sub-component, and my "git grep"
> to look only in that sub-component.

It sounds like your work focused solely on the sub-component you cd-d into. Did you have any other changes outside of that sub-component? Because when not, then both the current and the whole-tree "git add -u" would have the same effect.

The current and the whole-tree "git grep" would behave differently, of course. But even then a whole-tree "git grep" would be harmless and easy to limit in scope, though might be a bit annoying in the "cd deep down" case. In that case you would immediately see the matches outside of cwd, know that you forgot to limit the operation to cwd, so you hit the up key, simply append the "." to the last command, and you get what you wanted.

As mentioned in this or other related threads, this is not at all that simple the other way around, i.e. with current "git grep" when you are in the sub-component and you happen to need a grep on the whole tree, because you have to pay attention to use the right number of "../"s.

A whole-tree "git add -u" is just as easy to limit in scope as the whole-tree "git grep" would be, but certainly more annoying when you forget to limit it to cwd. But even in that case there is no harm done, because all the changes you've made are there, but you have to unstage changes from the index or split the commit.

Current "git add -u" is worst of all, because it's not just difficult to circumvent (how many "../" do I need?), but it's downright dangerous, because you can lose changes when forget that it's limited in scope. I managed to do something like this while fixing two already bisected bugs:

  git checkout deadbeef         # BugA was introduced in that commit
  vim git.c                     # fix BugA
  cd t
  test ; vim test ; test
  git add -u                    # again forgetting that a
                                # fundamentally whole-tree oriented 
                                # tool has operations with
                                # non-whole-tree defaults...
  git commit -m 'Fix BugA'      # will write proper commit msg later
  git branch fix_BugA           # to find the commit later
  git reset --hard babefeed     # instead of "git checkout babefeed"
                                # BugB was introduced there
                                # goodbye bugfix!
  # hack away to fix BugB       # until realisation sets in
  # Damn.

You could argue that there are several ways I could have prevented shooting myself in the foot, e.g. using "git checkout" instead of "git reset --hard", or by using plain "git commit" without the "-m" option I might have noticed the unstaged changes in the commit template. I would even tend to agree, but I still think that git should be consistent with _itself_ in the first place, and since git's fundamental concepts are whole-tree oriented and there are many commands that only make sense on the whole tree, defaulting to whole-tree operations for commands taking a pathspec is indeed better. And safer too.

Best, Gábor

Previous: Jeff KingNext: Jeff King
Message 14 of 34 in “"git add -u" broken in git 1.7.4?”
  1. Sebastian PippingFeb 6, 2011
  2. Jeff KingFeb 6, 2011
  3. Sebastian PippingFeb 6, 2011
  4. Matthieu MoyFeb 6, 2011
  5. SZEDER GáborFeb 6, 2011
  6. Sebastian PippingFeb 6, 2011
  7. Junio C HamanoFeb 7, 2011
  8. Jeff KingFeb 7, 2011
  9. Junio C HamanoFeb 7, 2011
  10. Nguyen Thai Ngoc DuyFeb 7, 2011
  11. SZEDER GáborFeb 7, 2011
  12. Junio C HamanoFeb 7, 2011
  13. Jeff KingFeb 7, 2011
  14. SZEDER GáborFeb 8, 2011
  15. Jeff KingFeb 9, 2011
  16. Junio C HamanoFeb 9, 2011
  17. Jeff KingFeb 9, 2011
  18. Nguyen Thai Ngoc DuyFeb 10, 2011
  19. Jeff KingFeb 10, 2011
  20. Junio C HamanoFeb 10, 2011
  21. Johannes SixtFeb 10, 2011
  22. Joshua JuranFeb 10, 2011
  23. Matthieu MoyFeb 10, 2011
  24. command-list.txt: mark git-archive plumbingNguyen Thai Ngoc Duy, Feb 15, 2011
  25. Junio C HamanoFeb 15, 2011
  26. Nguyen Thai Ngoc DuyFeb 16, 2011
  27. Matthieu MoyFeb 7, 2011
  28. Jeff KingFeb 7, 2011
  29. Junio C HamanoFeb 7, 2011
  30. Eric RaibleFeb 8, 2011
  31. Junio C HamanoFeb 8, 2011
  32. Matthieu MoyFeb 7, 2011
  33. Michael J GruberFeb 7, 2011
  34. SZEDER GáborFeb 7, 2011

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.