Questo è il comando git-blame che può essere eseguito nel provider di hosting gratuito OnWorks utilizzando una delle nostre numerose workstation online gratuite come Ubuntu Online, Fedora Online, l'emulatore online di Windows o l'emulatore online di MAC OS
PROGRAMMA:
NOME
git-blame - Mostra quale revisione e autore hanno modificato per ultimi ogni riga di un file
SINOSSI
git colpa [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
[-L ] [-S ] [-M] [-C] [-C] [-C] [--poiché= ]
[--abbreviazione= ] [ | --contenuti | --inverti ] [--]
DESCRIZIONE
Annota ogni riga nel file specificato con informazioni dalla revisione che dura
ha modificato la riga. Facoltativamente, inizia l'annotazione dalla revisione specificata.
Se specificato una o più volte, -L limita l'annotazione alle righe richieste.
L'origine delle linee viene automaticamente seguita durante le rinomine dell'intero file (attualmente
non c'è alcuna opzione per disattivare la funzione di rinomina). Per seguire le linee spostate da un file a un altro
un altro, o per seguire le linee che sono state copiate e incollate da un altro file, ecc., vedere il
Opzioni -C e -M.
Il rapporto non ti dice nulla sulle linee che sono state eliminate o sostituite; tu
è necessario utilizzare uno strumento come git diff o l'interfaccia "piccone" brevemente menzionata nel
paragrafo seguente.
Oltre a supportare l'annotazione dei file, Git supporta anche la ricerca nella cronologia di sviluppo
per quando un frammento di codice si è verificato in una modifica. Ciò consente di tenere traccia di quando un codice
il frammento è stato aggiunto a un file, spostato o copiato tra i file e infine eliminato o
sostituito. Funziona cercando una stringa di testo nel diff. Un piccolo esempio di
Interfaccia pickaxe che cerca blame_usage:
$ git log --pretty=oneline -S'blame_usage'
5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>
ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
VERSIONI
-b
Mostra SHA-1 vuoto per i commit di confine. Questo può anche essere controllato tramite
Opzione di configurazione blame.blankboundary.
--radice
Non trattare i commit di root come limiti. Questo può essere controllato anche tramite
Opzione di configurazione blame.showRoot.
--show-statistiche
Includere statistiche aggiuntive alla fine dell'output di blame.
-L , , -L :
Annota solo l'intervallo di linee specificato. Può essere specificato più volte. Sovrapposizione
sono consentiti intervalli.
E sono facoltativi. “-L " o "-L ,” si estende da A
fine del file. “-L , " si estende dall'inizio del file a .
e può assumere una di queste forme:
· numero
Se o è un numero, specifica un numero di riga assoluto (conta righe
dal 1).
· /espressione regolare/
Questo modulo utilizzerà la prima riga che corrisponde alla data regex POSIX. Se è un
regex, cercherà dalla fine dell'intervallo -L precedente, se presente, altrimenti
dall'inizio del file. Se è "^/regex/", cercherà dall'inizio di
file. Se è un'espressione regolare, cercherà a partire dalla riga data da .
· +offset o -offset
Questo è valido solo per e specificherà un numero di righe prima o dopo
la linea data da .
Se ": "è dato al posto di e , è un'espressione regolare
che denota l'intervallo dalla prima riga funcname che corrisponde , fino a
riga del nome della funzione successiva. “: ” ricerca dalla fine dell'intervallo -L precedente, se
any, altrimenti dall'inizio del file. “^: ” ricerca dall'inizio del file.
-l
Mostra giri lunghi (impostazione predefinita: disattivato).
-t
Mostra timestamp non elaborato (impostazione predefinita: disattivato).
-S
Utilizzare le revisioni dal file revs invece di chiamare elenco-git-rev(1).
--inversione
Sposta la cronologia in avanti invece che indietro. Invece di mostrare la revisione in cui un
è apparsa una riga, questo mostra l'ultima revisione in cui è esistita una riga. Ciò richiede
un intervallo di revisione come START..END in cui il percorso da incolpare esiste in START.
-p, --porcellana
Mostra in un formato progettato per la fruizione tramite macchina.
--line-porcellana
Mostra il formato porcellana, ma visualizza le informazioni di commit per ogni riga, non solo
prima volta che si fa riferimento a un commit. Implica --porcelain.
--incrementale
Mostra il risultato in modo incrementale in un formato progettato per il consumo automatico.
--codifica=
Specifica la codifica utilizzata per l'output dei nomi degli autori e dei riepiloghi dei commit. Impostandola su
nessuno fa sì che l'output di colpa produca dati non convertiti. Per maggiori informazioni, vedere la discussione
sulla codifica in git log(1) pagina di manuale.
--contenuto
Quando non è specificato, il comando annota le modifiche a partire dall'indietro da
la copia dell'albero di lavoro. Questo flag fa sì che il comando finga che la copia dell'albero di lavoro
ha il contenuto del file nominato (specificare - per far sì che il comando legga dal
input standard).
--data
Specifica il formato utilizzato per l'output delle date. Se --date non viene fornito, il valore di
Viene utilizzata la variabile di configurazione blame.date. Se anche la variabile di configurazione blame.date non è impostata,
viene utilizzato il formato iso. Per i valori supportati, vedere la discussione sull'opzione --date
at git log(1).
-M| |
Rileva le righe spostate o copiate all'interno di un file. Quando un commit sposta o copia un blocco di
linee (ad esempio il file originale ha A e poi B, e il commit lo cambia in B e
poi A), il tradizionale colpa l'algoritmo nota solo la metà del movimento e
in genere incolpa le linee che sono state spostate verso l'alto (ad esempio B) al genitore e assegna la colpa
alle linee che sono state spostate verso il basso (ad esempio A) al commit figlio. Con questa opzione, entrambi
i gruppi di linee vengono attribuiti al genitore tramite l'esecuzione di controlli supplementari.
è facoltativo ma è il limite inferiore del numero di caratteri alfanumerici
che Git deve rilevare come spostamento/copia all'interno di un file affinché possa associare quelle righe
con il commit padre. Il valore predefinito è 20.
-C| |
Oltre a -M, rileva le righe spostate o copiate da altri file che sono stati modificati in
lo stesso commit. Questo è utile quando si riorganizza il programma e si sposta il codice
tra i file. Quando questa opzione viene specificata due volte, il comando cerca anche
copie da altri file nel commit che crea il file. Quando questa opzione è specificata
tre volte, il comando cerca anche copie da altri file in qualsiasi commit.
è facoltativo ma è il limite inferiore del numero di caratteri alfanumerici
che Git deve rilevare come spostamento/copia tra file affinché possa associare quelle linee
con il commit padre. E il valore predefinito è 40. Se ci sono più di un -C
opzioni date, il l'argomento dell'ultimo -C avrà effetto.
-h
Mostra messaggio di aiuto.
-c
Utilizzare la stessa modalità di output di git-annotazione(1) (Predefinito: disattivato).
--punteggio-debug
Includere informazioni di debug relative allo spostamento delle linee tra i file (vedere -C)
e le linee spostate all'interno di un file (vedi -M). Il primo numero elencato è il punteggio. Questo è
il numero di caratteri alfanumerici rilevati come spostati tra o all'interno
file. Questo deve essere superiore a una certa soglia per git colpa considerare quelle linee di
il codice è stato spostato.
-f, --mostra-nome
Mostra il nome del file nel commit originale. Per impostazione predefinita, il nome del file viene visualizzato se è presente
qualsiasi riga proveniente da un file con un nome diverso, a causa del rilevamento della rinomina.
-n, --mostra-numero
Mostra il numero di riga nel commit originale (predefinito: disattivato).
-s
Elimina il nome dell'autore e la marca temporale dall'output.
-e, --mostra-email
Mostra l'email dell'autore invece del nome dell'autore (impostazione predefinita: disattivata). Può anche essere
controllato tramite l'opzione di configurazione blame.showEmail.
-w
Ignora gli spazi vuoti quando confronti la versione del genitore e quella del figlio per trovare dove
da dove provengono le linee.
--abbrev=
Invece di utilizzare le cifre esadecimali predefinite 7+1 come nome abbreviato dell'oggetto,
utilizzo +1 cifra. Si noti che 1 colonna viene utilizzata per un accento circonflesso per contrassegnare il commit del confine.
IL PORCELLANA FORMATO
In questo formato, ogni riga viene emessa dopo un'intestazione; l'intestazione ha almeno il
prima riga che ha:
· SHA-40 a 1 byte del commit a cui è attribuita la riga;
· il numero di riga della riga nel file originale;
· il numero di riga della riga nel file finale;
· su una riga che inizia un gruppo di righe da un commit diverso dal precedente,
il numero di righe in questo gruppo. Nelle righe successive questo campo è assente.
Questa riga di intestazione è seguita dalle seguenti informazioni almeno una volta per ogni commit:
· il nome dell'autore ("author"), l'email ("author-mail"), l'ora ("author-time") e il fuso orario
("author-tz"); analogamente per committer.
· il nome del file nel commit a cui è attribuita la riga.
· la prima riga del messaggio di log di commit ("riepilogo").
Il contenuto della riga effettiva viene visualizzato dopo l'intestazione sopra, preceduto da un TAB. Questo
è quello di consentire l'aggiunta successiva di altri elementi di intestazione.
Il formato porcellana in genere sopprime le informazioni di commit già visualizzate.
Ad esempio, due linee che sono attribuite allo stesso commit verranno entrambe mostrate, ma
i dettagli per quel commit verranno mostrati solo una volta. Questo è più efficiente, ma potrebbe richiedere
più informazioni sullo stato da mantenere da parte del lettore. L'opzione --line-porcelain può essere utilizzata per visualizzare l'output completo
informazioni di commit per ogni riga, consentendo un utilizzo più semplice (ma meno efficiente) come:
# conta il numero di righe attribuite a ciascun autore
git blame --line-porcelain file |
sed -n 's/^autore //p' |
ordina | uniq -c | ordina -rn
SPECIFICANDO GAMME
a differenza di git colpa e git annotare nelle versioni precedenti di git, l'estensione dell'annotazione
può essere limitato sia agli intervalli di riga che agli intervalli di revisione. L'opzione -L, che limita
annotazione su un intervallo di righe, può essere specificata più volte.
Quando sei interessato a trovare l'origine delle linee 40-60 per il file foo, puoi usare
l'opzione -L in questo modo (significano la stessa cosa: entrambe richiedono 21 righe a partire dalla riga
40):
git blame -L 40,60 foo
git blame -L 40,+21 foo
È anche possibile utilizzare un'espressione regolare per specificare l'intervallo di righe:
git blame -L '/^sub hello {/,/^}$/' foo
che limita l'annotazione al corpo della subroutine hello.
Quando non sei interessato alle modifiche precedenti alla versione v2.6.18 o alle modifiche precedenti alla 3
settimane, puoi usare specificatori di intervallo di revisione simili a git rev-lista:
git blame v2.6.18.. -- foo
git blame --since=3.weeks -- foo
Quando vengono utilizzati gli specificatori di intervallo di revisione per limitare l'annotazione, le linee che non hanno
modificato dal limite dell'intervallo (sia il commit v2.6.18 o il commit più recente che
ha più di 3 settimane nell'esempio precedente) sono responsabili di quel commit del limite di intervallo.
Un modo particolarmente utile è vedere se un file aggiunto ha linee create tramite copia e incolla
da file esistenti. A volte questo indica che lo sviluppatore è stato negligente e non ha
non rifattorizzare correttamente il codice. Puoi prima trovare il commit che ha introdotto il file
con:
git log --diff-filter=A --pretty=short -- foo
e quindi annotare la modifica tra il commit e i suoi genitori, utilizzando la notazione commit^!:
git blame -C -C -f $commit^! -- foo
INCREMENTALE USCITA
Se chiamato con l'opzione --incremental, il comando restituisce il risultato man mano che viene compilato.
l'output generalmente parlerà prima delle linee toccate dai commit più recenti (ad esempio
le linee saranno annotate fuori ordine) ed è pensato per essere utilizzato da visualizzatori interattivi.
Il formato di output è simile al formato Porcelain, ma non contiene l'effettivo
righe dal file che viene annotato.
1. Ogni voce di colpa inizia sempre con una riga di:
<sha40 esadecimale da 1 byte>
I numeri di riga partono da 1.
2. La prima volta che un commit viene visualizzato nel flusso, contiene varie altre informazioni
a riguardo stampato con un tag di una parola all'inizio di ogni riga che descrive il
informazioni aggiuntive sul commit (autore, email, committer, date, riepilogo, ecc.).
3. A differenza del formato Porcelain, le informazioni sul nome del file vengono sempre fornite e terminano
la voce:
"nome del file"
e quindi è davvero molto facile analizzare per alcuni parser orientati alla riga e alla parola
(che dovrebbe essere abbastanza naturale per la maggior parte dei linguaggi di scripting).
Note:
Per le persone che eseguono l'analisi: per renderlo più robusto, ignora semplicemente tutte le linee tra
il primo e l'ultimo (" " e "filename" righe) dove non riconosci
le parole chiave (o interessa a quella in particolare) all'inizio del
linee di "informazioni estese". In questo modo, se mai dovessero esserci informazioni aggiuntive (come
la codifica del commit o il commento esteso del commit), un visualizzatore di accuse non se ne preoccuperà.
MAPPATURA AUTORI
Se il file .mailmap esiste al livello più alto del repository o nella posizione indicata
dalle opzioni di configurazione mailmap.file o mailmap.blob, viene utilizzato per mappare l'autore e
nomi e indirizzi e-mail di committer a nomi reali e indirizzi e-mail canonici.
Nella forma semplice, ogni riga del file è costituita dal nome reale canonico di an
autore, spazi bianchi e un indirizzo email utilizzato nel commit (racchiuso da < e >) mappare
al nome. Per esempio:
Nome propriocommit@email.xx>
Le forme più complesse sono:
<corretto@email.xx>commit@email.xx>
che consente a mailmap di sostituire solo la parte email di un commit e:
Nome propriocorretto@email.xx>commit@email.xx>
che consente a mailmap di sostituire sia il nome che l'e-mail di un commit che corrisponde al
indirizzo email di commit specificato e:
Nome propriocorretto@email.xx> Nome commitcommit@email.xx>
che consente a mailmap di sostituire sia il nome che l'e-mail di un commit che corrisponde a entrambi
nome commit e indirizzo email specificati.
Esempio 1: la tua cronologia contiene commit di due autori, Jane e Joe, i cui nomi compaiono
nel repository sotto diverse forme:
Joe Sviluppatorejoe@esempio.com>
Joe R. Sviluppatorejoe@esempio.com>
Jane Doejane@esempio.com>
Jane Doe
Jane D.
Supponiamo ora che Joe voglia usare l'iniziale del suo secondo nome e che Jane preferisca il suo cognome
completamente enunciato. Un file .mailmap corretto sarebbe simile a:
Jane Doe
Joe R. Sviluppatorejoe@esempio.com>
Nota come non è necessaria una voce per , perché il vero nome di
quell'autore ha già ragione.
Esempio 2: il tuo repository contiene commit dei seguenti autori:
nick1bugs@azienda.xx>
nick2bugs@azienda.xx>
nick2nick2@azienda.xx>
babbo nataleio@azienda.xx>
clausio@azienda.xx>
CTOcto@azienda.xx>
Quindi potresti volere un file .mailmap che assomigli a:
<cto@azienda.xx>cto@azienda.xx>
alcuni tizioalcuni@dude.xx> nick1bugs@azienda.xx>
Altro autorealtro@autore.xx> nick2bugs@azienda.xx>
Altro autorealtro@autore.xx>nick2@azienda.xx>
Babbo Natalebabbo natale@polo nord.xx>io@azienda.xx>
Usa hash # per i commenti che si trovano sulla propria riga o dopo l'indirizzo e-mail.
Utilizzare git-blame online utilizzando i servizi onworks.net