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

Re: Bug in "git rev-parse --verify"

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Mar 30, 2013, 03:44 UTC
Message-ID
<51565F96.1020203@alum.mit.edu>
In-Reply-To
<7vli97v558.fsf@alter.siamese.dyndns.org>
On 03/28/2013 05:52 PM, Junio C Hamano wrote:
Show 7 quoted lines
> You could force rev-parse to resolve the input to an existing
> object, with something like this:
> 
> 	git rev-parse --verify "$ARG^{}"
> 
> It will unwrap a tag, so the output may end up pointing at a object
> that is different from $ARG in such a case.
Yes, if unwrapping tags is OK then this would work.
> But what is the purpose of turning a random string to a random
> 40-hex in the first place?

In non-trivial scripts, it makes sense to convert user input into a known and verified quantity (SHA1) once, while processing external inputs, and not have to think about it afterwards. Verifying and converting to pure-SHA1s as soon as possible has several advantages:

1. An SHA1 is a canonical representation of the argument, useful for
example as the key in a hash map for for looking for the presence of a
commit in a rev-list output.
2. An SHA1 is persistent.  For example, I use them when caching
benchmark results across versions.  Moreover, they are safe for use in
filenames.  The persistence also makes scripts more robust against
simultaneous changes to the repo by other processes, whereas if I use a
string like "branch^" multiple times, there is no guarantee that it
always refers to the same commit.
3. Verifying arguments at one spot centralizes error-checking at the
start of a script and eliminates one reason for random git commands to
fail later (when error recovery is perhaps more difficult).
4. Converting once avoids the overhead of repeated conversion from a
free-form committish into an object name if the argument needs to be
passed to multiple git commands (though presumably the overhead is
insignificant in most cases).

Undoubtedly in many cases this practice of early-verification-and-conversion is unnecessary, or the same benefit could be had from either verifying or converting without doing both. But verifying-and-converting is easy, cheap, and means not having to decide on a case-by-case basis whether it could have been avoided.

Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
Previous: Junio C HamanoNext: Junio C Hamano
Message 9 of 22 in “Bug in "git rev-parse --verify"”
  1. Michael HaggertyMar 28, 2013
  2. Jeff KingMar 28, 2013
  3. Junio C HamanoMar 28, 2013
  4. Michael HaggertyMar 28, 2013
  5. Jeff KingMar 28, 2013
  6. Michael HaggertyMar 28, 2013
  7. Jeff KingMar 28, 2013
  8. Junio C HamanoMar 28, 2013
  9. Michael HaggertyMar 30, 2013
  10. Junio C HamanoMar 30, 2013
  11. Junio C HamanoMar 30, 2013
  12. Michael HaggertyMar 30, 2013
  13. Junio C HamanoMar 30, 2013
  14. Junio C HamanoMar 30, 2013
  15. Michael HaggertyMar 30, 2013
  16. Elia PintoMar 30, 2013
  17. 1/2 peel_onion: disambiguate to favor tree-ish when we want a tree-ishJunio C Hamano, Mar 31, 2013
  18. 2/2 peel_onion(): teach $foo^{object} peelerJunio C Hamano, Mar 31, 2013
  19. Michael HaggertyApr 2, 2013
  20. Junio C HamanoApr 2, 2013
  21. Michael HaggertyApr 2, 2013
  22. Junio C HamanoApr 2, 2013

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.