* get commit ID from a tree object ID
@ 2018-03-17 12:17 Michal Novotny
2018-03-17 13:01 ` Konstantin Khomoutov
0 siblings, 1 reply; 6+ messages in thread
From: Michal Novotny @ 2018-03-17 12:17 UTC (permalink / raw)
To: git
Hello,
let's say I have made an annotated tag on a certain treeish:
$ git tag -a -m msg tagname HEAD:
Now, I can try to see the content of the tag:
$ git tag -v tagname
object 42a1c36553a50ceae2f75ffc4b1446c6c393eae7
type tree
tag tagname
tagger clime <clime@redhat.com> 1521288727 +0100
msg
error: no signature found
Can I use that object ID 42a1c36553a50ceae2f75ffc4b1446c6c393eae7 to
get back to a particular commit from which the tag was created? The
reason is that I would eventually like to checkout that commit.
Thank you
clime
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: get commit ID from a tree object ID
2018-03-17 12:17 get commit ID from a tree object ID Michal Novotny
@ 2018-03-17 13:01 ` Konstantin Khomoutov
2018-03-17 16:18 ` Jeff King
0 siblings, 1 reply; 6+ messages in thread
From: Konstantin Khomoutov @ 2018-03-17 13:01 UTC (permalink / raw)
To: Michal Novotny; +Cc: git
On Sat, Mar 17, 2018 at 01:17:12PM +0100, Michal Novotny wrote:
> let's say I have made an annotated tag on a certain treeish:
>
> $ git tag -a -m msg tagname HEAD:
>
> Now, I can try to see the content of the tag:
>
> $ git tag -v tagname
> object 42a1c36553a50ceae2f75ffc4b1446c6c393eae7
> type tree
> tag tagname
> tagger clime <clime@redhat.com> 1521288727 +0100
>
> msg
> error: no signature found
>
>
> Can I use that object ID 42a1c36553a50ceae2f75ffc4b1446c6c393eae7 to
> get back to a particular commit from which the tag was created? The
> reason is that I would eventually like to checkout that commit.
In general, you can't, and that's because there can be any number of
commits referencing that tree. A typical case is a tree object
representing a subdirectory of your project which changes rarily, if
ever - in this case, each commit which includes the same state of this
subdirectory will refer the same tree object.
Another point to consider is that the commit itself only refers to a
single tree object -- that one which records the state of the top-level
project directory, and it usually refers to other three objects which
may, in turn, refer to others and so on - all the way down.
So actually a generic approach to what you need is a full scan of all
the commits in the repository with recursive traversing of the hierarchy
of trees of each of them (via `git ls-tree`) and looking for the SHA-1
name of the reference tree object. As you can see, this is not going to
be fast on repos of realistic size.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: get commit ID from a tree object ID
2018-03-17 13:01 ` Konstantin Khomoutov
@ 2018-03-17 16:18 ` Jeff King
2018-03-17 17:57 ` Junio C Hamano
0 siblings, 1 reply; 6+ messages in thread
From: Jeff King @ 2018-03-17 16:18 UTC (permalink / raw)
To: Konstantin Khomoutov; +Cc: Michal Novotny, git
On Sat, Mar 17, 2018 at 04:01:28PM +0300, Konstantin Khomoutov wrote:
> So actually a generic approach to what you need is a full scan of all
> the commits in the repository with recursive traversing of the hierarchy
> of trees of each of them (via `git ls-tree`) and looking for the SHA-1
> name of the reference tree object. As you can see, this is not going to
> be fast on repos of realistic size.
If you assume that the tree is a root tree (which is by no means
certain, but a good guess), it's not _too_ bad to do:
git rev-list --all --format='%T %H' | grep ^$desired_tree
That's linear in the number of commits, but still takes only about 7
seconds on linux.git.
If you want to dig further, you can use the diff machinery to show which
commit introduced a particular tree, like:
git rev-list --all |
git diff-tree --stdin --pretty=raw --raw -t -r |
less +/$desired_tree
That "less" will find the mentioned tree, and then you'll have to
manually read the commit. It would be possible to do it mechanically
with a short perl script, but I'll leave that as an exercise for the
reader.
-Peff
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: get commit ID from a tree object ID
2018-03-17 16:18 ` Jeff King
@ 2018-03-17 17:57 ` Junio C Hamano
2018-03-26 22:14 ` Stefan Beller
0 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2018-03-17 17:57 UTC (permalink / raw)
To: Jeff King; +Cc: Konstantin Khomoutov, Michal Novotny, git
Jeff King <peff@peff.net> writes:
> If you want to dig further, you can use the diff machinery to show which
> commit introduced a particular tree, like:
>
> git rev-list --all |
> git diff-tree --stdin --pretty=raw --raw -t -r |
> less +/$desired_tree
>
> That "less" will find the mentioned tree, and then you'll have to
> manually read the commit. It would be possible to do it mechanically
> with a short perl script, but I'll leave that as an exercise for the
> reader.
Before Stefan jumps in ;-) I wonder if a recently materialized
"find-object" option to the diff family can be used here as a
sugar-coated way.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: get commit ID from a tree object ID
2018-03-17 17:57 ` Junio C Hamano
@ 2018-03-26 22:14 ` Stefan Beller
2018-03-26 22:21 ` Jonathan Nieder
0 siblings, 1 reply; 6+ messages in thread
From: Stefan Beller @ 2018-03-26 22:14 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Jeff King, kostix, clime, git
On Sat, Mar 17, 2018 at 10:57 AM Junio C Hamano <gitster@pobox.com> wrote:
> Jeff King <peff@peff.net> writes:
> > If you want to dig further, you can use the diff machinery to show which
> > commit introduced a particular tree, like:
> >
> > git rev-list --all |
> > git diff-tree --stdin --pretty=raw --raw -t -r |
> > less +/$desired_tree
> >
> > That "less" will find the mentioned tree, and then you'll have to
> > manually read the commit. It would be possible to do it mechanically
> > with a short perl script, but I'll leave that as an exercise for the
> > reader.
> Before Stefan jumps in ;-) I wonder if a recently materialized
> "find-object" option to the diff family can be used here as a
> sugar-coated way.
I am late to jump in, but testing the 'git log --find-object'
seems to have issues with trees named by sha1 here,
but the named tree via <commit>:<path> still seems to work.
It seems reasonable to be able to find trees using the find-object
flag, though.
Stefan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: get commit ID from a tree object ID
2018-03-26 22:14 ` Stefan Beller
@ 2018-03-26 22:21 ` Jonathan Nieder
0 siblings, 0 replies; 6+ messages in thread
From: Jonathan Nieder @ 2018-03-26 22:21 UTC (permalink / raw)
To: Stefan Beller; +Cc: Junio C Hamano, Jeff King, kostix, clime, git
Hi,
Stefan Beller wrote:
> On Sat, Mar 17, 2018 at 10:57 AM Junio C Hamano <gitster@pobox.com> wrote:
>> Jeff King <peff@peff.net> writes:
>>> If you want to dig further, you can use the diff machinery to show which
>>> commit introduced a particular tree, like:
>>>
>>> git rev-list --all |
>>> git diff-tree --stdin --pretty=raw --raw -t -r |
>>> less +/$desired_tree
>>>
>>> That "less" will find the mentioned tree, and then you'll have to
>>> manually read the commit. It would be possible to do it mechanically
>>> with a short perl script, but I'll leave that as an exercise for the
>>> reader.
>
>> Before Stefan jumps in ;-) I wonder if a recently materialized
>> "find-object" option to the diff family can be used here as a
>> sugar-coated way.
>
> I am late to jump in, but testing the 'git log --find-object'
> seems to have issues with trees named by sha1 here,
> but the named tree via <commit>:<path> still seems to work.
Experimenting a little more, I wondered if "-t" wasn't being passed
by default:
$ git --oneline log -t --find-object=$(git rev-parse HEAD~30:Documentation/technical)
$
No, that's not it. Could it have to do with merges?
$ git log --oneline -m --first-parent --find-object=$(git rev-parse HEAD~30:Documentation/technical)
df6cfe8c30 Merge branch 'debian-experimental' into google3
f86d5fd2e4 Merge branch 'debian-experimental' into google3
Yes.
That doesn't explain why <commit>:<path> worked for you, though. :)
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-03-26 22:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-17 12:17 get commit ID from a tree object ID Michal Novotny
2018-03-17 13:01 ` Konstantin Khomoutov
2018-03-17 16:18 ` Jeff King
2018-03-17 17:57 ` Junio C Hamano
2018-03-26 22:14 ` Stefan Beller
2018-03-26 22:21 ` Jonathan Nieder
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).