2009-12-07 11 views
13

Diciamo che ho un file A.cpp e noto un errore sulla riga 15 del file. Diciamo che l'errore è un "const" su una funzione che restituisce un puntatore a una variabile membro, il che significa che l'uso di const sulla funzione è tecnicamente corretto ma semanticamente sbagliato. Vorrei discutere della semantica con l'autore che ha apportato la modifica.Utilizzare git per trovare la prima introduzione di token su una riga specifica di un file

Utilizzando git, c'è un modo per scoprire quale revisione ha introdotto il token "const"? Più specificamente, mi piacerebbe sapere chi ha introdotto il token.

"git blame" indica chi ha effettuato l'ultima modifica alla riga, ma in realtà vorrei trovare il primo commit contenente il token.

+0

Non è possibile diff ogni revisione finché non viene visualizzata? Scusa, non ne so molto di Git, ma è quello che farei per altri sistemi di controllo del codice sorgente. –

+0

Sì, ma potrebbe richiedere molto tempo ... la cronologia del repository risale a almeno 3 anni con diverse migliaia di commit su questo file. Questo sembra un compito abbastanza comune, sembra che ci sarebbe un modo migliore per farlo. – paxos1977

+0

Vedere anche [git: trovare un commit che ha introdotto una stringa] (http://stackoverflow.com/questions/5816134/git-finding-a-commit-that-introduced-a-string). –

risposta

13

git bisect è quello che stai cercando. Con questo comando puoi trovare rapidamente quale commit ha introdotto il const.

Si avvia il processo con git bisect start, quindi contrassegnare una versione precedente senza la const con git bisect good e quella corrente come bisect bad. Quindi il sistema ti invierà a una versione nel mezzo. Puoi controllare se la malvagia const è lì e segnare quella versione buona o cattiva a seconda di essa. Quindi il processo viene ripetuto finché non trovi il commit errato.

+4

Se puoi scrivere un semplice script che esce con 1 se la costante è lì (cioè uno stato "cattivo"), chiama 'git bisect run myscript', siediti e goditi git facendo il lavoro per te ... –

1

Io uso QGit per questo, selezionare le linee di interesse e filtrare su quello, quindi si vede solo l'elenco delle modifiche per quella linea. Per una singola riga non è necessario saltare alcune revisioni.

via:

  • qgit aperto sul repository
  • vista Albero
  • Trova file
  • linea ritrovamento
  • selezionare la linea di interesse
  • premere 'filtro revisione delle linee selezionate' pulsante, sembra un imbuto.
2

Se la linea esistito senza la const gettone in qualche commit che si sa, si può cominciare da lì e utilizzare il flag --reverse su git-colpa per trovare l'ultima revisione in cui la linea non ha avuto la const Token . Quindi guarda la prossima revisione sul file dopo.

4

La modifica potrebbe non essere sempre stata sulla riga 15 di A.cpp, quindi utilizzare il contesto circostante. Dire che è stata una definizione di const int foobar:

git grep 'const *int *foobar' \ 
    $(git log --reverse --pretty=format:%H -- A.cpp) -- \ 
    A.cpp | head -1 

Questa ricerca in avanti nel tempo attraverso tutti i commit sul ramo corrente che toccano A.cpp e trova il primo che contiene il modello incriminato. L'output sarà SHA-1 del commit e la riga corrispondente nella sua revisione di A.cpp.

Una volta noto l'impegno, utilizzare git show per apprendere l'autore.

28

Ci sono alcuni modi possibili per farlo.

  • git blame, o meglio grafica strumento di colpa (come git gui blame o la vista in git instaweb/gitweb colpa) per sfogliare la storia di una linea, andando indietro nella storia fino a trovare adeguata commit.

  • cosiddetta "ricerca di piccone", vale a dire git log -S con adeguato gettone/regexp, per trovare (lista) tutti i commit in cui il numero di dato segno cambiato (che di solito significa in cui è stato aggiunto o eliminato dato token), ad esempio:

    git log --reverse -p -S'const int foobar' -- A.cpp 
    
  • git bisect dove "cattivo" significherebbe commettere quello con 'const' dove ci si non dovrebbe essere (il test utilizzando ad esempio grep).

Problemi correlati