views:

42

answers:

3

Is there a way, short of actually checking out the parent commit, to determine a submodule's SHA-1 commit ID based on a commit ID in the parent clone? I know I can find the currently associated SHA-1 with 'git submodule'.

Here's an example: I have a clone with a single submodule 'foo' that has changed several times in the last month. I have a tag in the parent clone that is a few weeks old called 'released-1.2.3'. I want to find out what the associated SHA-1 of 'foo' was for this tagged commit. I could simply check out 'released-1.2.3' and use git-submodule to see, but I'm wondering if there's a way to do this without affecting the working tree, as I want to script it.

I want to do this because I want to construct a script to do a 'diff' on all changes within a submodule between two commits within the parent repository - i.e. "tell me what files changed within the submodule 'foo' between these two commits in the parent."

A: 

I did find one promising avenue:

$ git log --raw <since>..<until> --submodule -- <path/to/submodule>

With the --raw option, this does print out the (abbreviated) SHA-1 IDs corresponding to the submodule's associated commits. Unfortunately the output is very verbose and will take some work to process in a script.

What I really need is a git facility that, given a parent commit ID, gives me the latest change to a submodule prior to that commit. I.e. which submodule SHA-1 'git submodule update' would check out if I were to actually checkout that parent commit.

meowsqueak
git log --format=%H will get you hashes.. so will git rev-parse
adymitruk
working on an answer..
adymitruk
Thanks for your comments, adymitruk. However --format=%H and rev-parse return the hashes for the parent clone's commit, not the actual hash of the submodule, unfortunately.
meowsqueak
A: 

git slave (gits) might be your answer.

http://gitslave.sourceforge.net/

But you can also do this with plain git.. it's not as easy.

adymitruk
edited again as SO parser was eating part of my answer..
adymitruk
+1  A: 

You may use git-ls-tree to see what the SHA-1 id of a given path was during a given commit:

$ git ls-tree released-1.2.3 foo
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  foo

(My first thought was git show released-1.2.3 foo, but that fails with "fatal: bad object".)

Also: When writing scripts around git, try to stick to the plumbing commands.

jleedev
I think this is the answer I'm looking for - this does seem to return the hash of the submodule for the specified parent commit. Thank you. Also, plumbing comment noted - thanks.
meowsqueak