2010-10-21 13 views
37

C'è un modo, a parte il controllo effettivo del commit parent, per determinare l'ID di commit SHA-1 di un sottomodulo basato su un ID di commit nel clone genitore? So che posso trovare lo SHA-1 attualmente associato con 'git submodule'.Come posso ottenere un ID commit associato al sottomodello git da un commit passato nel clone padre?

Ecco un esempio: Ho un clone con un singolo sottomodulo "foo" che è stato modificato più volte nell'ultimo mese. Ho un tag nel clone genitore di poche settimane chiamato 'released-1.2.3'. Voglio scoprire che cosa era lo SHA-1 associato di "pippo" per questo commit taggato. Potrei semplicemente controllare 'rilasciato-1.2.3' e usare git-submodule per vedere, ma mi chiedo se c'è un modo per farlo senza influenzare l'albero di lavoro, dato che voglio scriverlo.

Voglio farlo perché voglio creare uno script per fare una "diff" su tutte le modifiche all'interno di un sottomodulo tra due commit all'interno del repository principale - ad esempio "dimmi quali file sono stati modificati nel sottomodulo" foo "tra questi due si commettono nel genitore. "

risposta

49

È possibile utilizzare git-ls-tree per vedere ciò che lo SHA-1 id di un dato percorso è stato durante un determinato commit:

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

(Il mio primo pensiero è stato git show released-1.2.3 foo, ma che non riesce con "fatale: bad oggetto" .)

dal momento che si sta scripting l'uscita, probabilmente si vuole ottenere solo l'SHA-1 id di per sé, ad esempio:

$ git ls-tree released-1.2.3 foo | awk '{print $3}' 
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 

anche: Durante la scrittura sc gira attorno a git, prova ad attenersi ai comandi plumbing, come descritto nel manuale. Hanno un'interfaccia più stabile, mentre i comandi più familiari della "porcellana" possono cambiare in modi incompatibili.

+0

Penso che questa sia la risposta che sto cercando - questo sembra restituire l'hash del sottomodulo per il commit genitore specificato. Grazie. Inoltre, commento idraulico notato - grazie. – meowsqueak

+3

Per scoprire i sottomoduli con i loro hash con commit arbitrario: 'git ls-tree --full-tree -r commit | grep^160000'. Il grep è per la modalità utilizzata per i collegamenti del sottomodulo. –

+0

@ S.ChristofferEliesen, aggiungi -r per trovare tutti i sottomoduli, non solo quelli in ./ –

2

ho trovato una strada promettente:

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

Con l'opzione --raw, questo non stampare i (abbreviato) SHA-1 gli ID corrispondenti al commit associate del sottomodulo. Sfortunatamente l'output è molto prolisso e richiederà un po 'di lavoro da elaborare in uno script.

Ciò di cui ho veramente bisogno è una funzione git che, dato un ID commit genitore, mi dia l'ultima modifica ad un sottomodulo prima di quel commit. Cioè quale sottomodulo SHA-1 'git submodule update' verrebbe a verificare se dovessi effettivamente effettuare il checkout del genitore commit.

+0

git log --format =% H otterrà hash .. quindi git rev-parse –

+0

lavorando su una risposta .. –

+1

Grazie per i vostri commenti, adymitruk. Tuttavia --format =% H e rev-parse restituiscono gli hash per il commit del clone genitore, sfortunatamente non l'hash effettivo del sottomodulo. – meowsqueak

0

git slave (gits) potrebbe essere la vostra risposta.

http://gitslave.sourceforge.net/

Ma si può anche fare questo con git pianura .. non è così facile.

+0

modificato di nuovo come SO parser stava mangiando parte della mia risposta .. –

3

Questo ha funzionato per me:

$ git rev-parse released-1.2.3^{commit}:foo 
<SHA1> 

Forse anche abbastanza facile da usare nello script.

+0

Sono stato sorpreso di vedere che 'rev-parse' ha capito il sottomodulo. –

Problemi correlati