Come 'colpa git' sul repository remoto-side?
Domanda
sul mio server ho ospite progetti mia git personali remote-laterali (con gitosis), e ho costruito un'interfaccia web per navigare i repository (qualcosa come Github).
Sul telecomando-side, è non sono autorizzati a fare un sacco di cose, perché un albero di lavoro manca, e questo è corretto: btw, per un esploratore repository, con pochi comandi che posso fare quasi tutto
ad eccezione di colpa git .
Non sono in grado di trovare il modo di dare la colpa di un file senza un albero di lavoro, all'interno del repository remoto lato. Ha ottenuto alcune idee?
Soluzione
Il seguente dovrebbe funzionare anche nei repository nudi:
git blame <rev> -- <path>
per es.
git blame master -- README.txt
Altri suggerimenti
Io non sono in grado di trovare dove la documentazione git parlano - opzione, dal modo in cui funziona molto
In realtà, questo è necessario perché "git blame
" si prepara ad assumere un
antico ordine argomento strano "blame <path> <rev>
" in aggiunta al
solito "blame [<rev>] <path>
".
Ciò significa che, come Git 2.17 (Q2 2018) spiegherà "git blame HEAD COPYING
" in un repository nudo non è riuscito a correre, mentre "git blame HEAD -- COPYING
" gestito bene.
Ma da 2.17 in poi, non sarà necessario '--
' più.
commettere 0c668f5 (5 febbraio 2018) da Junio ??Hamano C (gitster
)
(fusa per Junio ??Hamano C - gitster
- in commettere 0c668f5 , 7 febbraio 2018)
blame
: stringere riga di comando parserUn antico ordine degli argomenti dispari "
blame <path> <rev>
" in aggiunta al solito "blame [<rev>] <path>
" ha almeno due negative ramificazioni:
Per raccontare questi due a parte, controlla se l'ultimo comando nomi degli argomenti linea di un percorso nella albero di lavoro, che utilizzano
file_exists()
.
Tuttavia, "blame <rev> <path>
" è una richiesta di spiegare ogni riga il contenuto di<path>
memorizzati nel revisione<rev>
e non ha bisogno di avere una versione albero di lavoro del file. Un controllo confile_exists()
è semplicemente sbagliato.Per costringere che sbaglia controllo
file_exists()
al lavoro, il codice chiamatesetup_work_tree()
prima di farlo, perché il percorso che ha è relativo al livello superiore della struttura del progetto.
Tuttavia, "blame <rev> <path>
" deve essere utilizzabile anche in un repository nuda, e non v'è alcuna ragione per lasciaresetup_work_tree()
lamentano e morire con "Questa operazione deve essere eseguita in un albero di lavoro".Per correggere l'ex, interruttore per controllare se l'ultimo token è una revisione (e in tal caso, gli argomenti di parsing che utilizzano "
blame <path> <rev>
" regola).Correggere quest'ultimo per sbarazzarsi di
setup_work_tree()
e controllofile_exists()
- l'unico caso la chiamata a questo importa funzione è quando ci sono in esecuzione "blame <path>
" (vale a dire senza iniziando revisione e chiedendo di dare la colpa al file di albero di lavoro a<path>
, scavando attraverso laHEAD
revisione), ma v'è una chiamata insetup_scoreboard()
solo prima di chiamarefake_working_tree_commit()
.
Così, in breve, a partire Git 2.17, questo funzionerà in un repo nuda:
git blame master -- README.txt
E con Git 2.22, il messaggio di errore "This operation must be run in a work tree
" dovrebbe scomparire!
"git blame -- path
" in un non-nudo inizia repository incolpare dall'albero di lavoro, e lo stesso comando in un nudo gli errori repository fuori perché non c'è albero di lavoro per definizione.
Il comando è stato insegnato a cominciare invece incolpare dal commettere alla testa,
che è più utile.
commettere a544fb0 (7 Aprile 2019) di Szeder Gábor (szeder
)
(fusa per Junio ??Hamano C - gitster
- in commettere d8620d3 25 apr 2019)
blame
: predefinito a testa in un repo nuda quando nessun co inizioMMIT è data ??h2>Quando '
git blame
' viene invocato senza specificare il commit per iniziare incolpando da, si riparte dallo stato del file specificato nella struttura di lavoro.
Tuttavia, quando viene richiamato in un repository nudo senza un inizio commit, allora non c'è stato di albero di lavoro da cui partire, e muore con la seguente messaggio di errore:$ git rev-parse --is-bare-repository true $ git blame file.c fatal: this operation must be run in a work tree
Questa è fuorviante, perché implica che '
git blame
' non lavoro nei repository nudi a tutti, ma lo fa, infatti, funzionano bene quando si è dato un commit da cui partire.Si potrebbe migliorare il messaggio di errore, naturalmente, ma facciamo solo di default a testa in un repository nuda, invece, come più probabile che è ciò che l'utente ha voluto in ogni caso (se volevano iniziare da un altro commit, allora avrebbero precisato che, in primo luogo).
'
git annotate
' è solo un sottile wrapper 'git blame
', così nel stessa situazione è stampato lo stesso messaggio di errore fuorviante, e questo patch risolve, anche.