2014-12-08 16 views
10

La mia azienda non gestisce il repository con git (utilizziamo efficacemente CVS), ma mantengo un repository in locale per la mia sanità mentale. In passato, volevo richiamare i commit relativi a, diciamo, bug-report-abcde. Posso grep attraverso i messaggi di commit per trovare bug-report-abcde e sfogliarli. In questo momento, ho una funzione di Emacs agganciato a fornire il nome del ramo corrente come un 'colpo di testa' nel commettere:Come posso tenere traccia di dove i commit provenivano una volta che sono stati uniti?

Title 

Summary summary summary 

Branch: bug-report-abcde 

Così la mia domanda è: è questo il modo migliore per trovare quale ramo era la fonte originale di un commit, dopo che il commit è stato unito ad un altro ramo? O c'è un modo per estrarre queste informazioni da git stesso?

+0

I progettisti Git hanno preso una decisione in anticipo per non tracciare il tipo di informazioni che si cercano. Puoi trovare molte discussioni accese negli archivi internet del 2005 su questo argomento. Ci sono modi per fingere un po 'se si sta usando un server centrale, ma non sembra essere il tuo caso. –

+0

@AndrewC Se riesci a trovare un messaggio di elenco che supporti questo, "No can do" è una risposta accettabile. –

risposta

2

Git non tiene traccia di queste informazioni in base alla progettazione.

http://markmail.org/message/yfb5ihwddjmrstz6

So don't think of it as "git throws away branch identity" as much as 
"git never cared about branch identity in the first place, and doesn't 
think it's relevant." 

tuo nome ramo è proprio questo, il vostro nome del ramo. Può essere letteralmente tutto ciò che vuoi. Oppure non è possibile utilizzare il nome di un ramo ed essere nello stato di testa staccata. A lungo termine, viene memorizzata solo la raggiungibilità.

Se si desidera tenere traccia delle informazioni (ad esempio un numero di difetto), è necessario includerle nel messaggio di commit.

Se si utilizza un server centrale è possibile impostare un gancio di ricezione che registri le informazioni sul nome del ramo remoto in qualche modo (git notes per esempio). La mia compagnia usa questo. Lo trovo solo quasi-utile (principalmente se si vuole urlare a un program manager invece del ragazzo che ha scritto o inserito il codice).

+0

Sto accettando questa risposta perché fornisce una fonte definitiva che indica che questo non è possibile nel caso generale. Una buona soluzione per l'identificazione di * alcuni commit del ramo * - quelli in cui è stato eseguito un commit di unione - può essere trovata nella [risposta eccellente] di @ jthill (http://stackoverflow.com/a/27435086/1443496). –

+1

Per completezza - funziona solo per un sottoinsieme di commit unione. * se * si sono fusi da un ramo con un nome che ha significato per te, e * se * a sinistra il nome del ramo nel messaggio di commit. –

6
merges-introducing() { 
    # merges-introducing $introducing [$descendant] 
    local introducing; 
    if introducing=`git rev-parse $1`; then 
     shift 
     git rev-list --ancestry-path --parents --reverse ^$introducing ${@-HEAD} \ 
     | awk '{seen[$1]=1} NR>1 && !seen[$2] {print $1}' \ 
     | xargs -r git show --oneline --no-patch 
    fi 
} 

Trova le unioni che incorporano un commit da una cronologia unita.

git rev-list s' --ancestry-path elenca solo i commit sulla linea di discendenza dal fondo impegnano (^$introducing qui) verso l'alto (default HEAD, checkout corrente), --parents dà i genitori per ciascuno di essi, --reverse liste i commit prima il più vecchio (quindi $introducing viene prima) e la post-elaborazione, awk|xargs, stampa solo le unioni il cui primo genitore non si trova su quel percorso genealogico.

A meno che qualcuno non sia entrato e abbia modificato manualmente i messaggi di unione, le righe dell'oggetto per tali commit diranno il nome del ramo e qualsiasi URL di origine delle unioni pertinenti (e non fastforward), prima le più vecchie.

+0

@SeanAllred, questo non funziona per te? – jthill

+0

Le mie scuse; la notifica deve essere passata attraverso la mia casella di posta. Ci provo entro un giorno o giù di lì. –

+0

Questa è una funzione di Bash, sì? Sourced in bash, invariabilmente mostra solo il commit più recente, indipendentemente dal fatto che sia effettivamente correlato. –

Problemi correlati