2010-03-19 10 views
11

Io uso git per il mio lavoro locale (e lo amo così tanto), e seguo un flusso di lavoro simile a quello descritto in this article. Quindi, in sostanza, quando si inizia una nuova funzione, creo un ramo per esso, eseguo il solito hack e poi eseguo il commit, e quando penso di averlo fatto lo schiaccio in un singolo commit usando git rebase --interactive master e io sempre finiscono per modificare la moltitudine di messaggi di commit in qualcosa che cercano come l'esempio in questo articolo, riprodotto qui:Come personalizzare il formato di git rebase - messaggi di commit interattivi?

[#3275] User Can Add A Comment To a Post 

* Adding Comment model, migrations, spec 
* Adding Comment controller, helper, spec 
* Adding Comment relationship with Post 
* Comment belongs to a User 
* Comment form on Post show page 

Naturalmente, questo è, dopo un po 'di rimozione # This is the xth commit message linee e copia/incolla * di fronte a ogni messaggio di commit .

Ora, quello che mi chiedevo, C'è un modo per personalizzare il modo in git rebase -i uscite la schiacciata messaggi di commit in modo che non hanno a che fare tutto ciò che l'hacking?

(io uso msysgit, se quello che conta. Il mio editore è Notepad ++.)

Grazie!

+1

Si dovrebbe pensare di cambiare la risposta accettata, dal momento che Git ha aggiunto il supporto per questo ora – Joakim

+0

@Joakim Come discusso in seguito, il git 2.6 funzione non corrisponde esattamente il PO, quindi la risposta di Jefromi stand. – VonC

risposta

4

Non c'è modo (a parte hackerare l'origine) per modificare il modello di messaggio di squash, non credo. Tuttavia, avete un paio di opzioni:

  • utilizzare un comando git log per ottenere la lista, qualcosa come `git log --pretty = "*% s" commit-1..commit-2 per arrivare i tuoi proiettili. In Linux è molto possibile farlo all'interno del tuo editor - non so come funziona con msysgit.

  • Chiedi al tuo editore di fare il lavoro per te! Non so quale sia il tuo editor, quindi non posso davvero dirvi cosa fare, ma sarebbe certamente molto possibile in vim. (L'essere idea: cercare /# This is the .* commit message/, eliminare un paio di linee, mantenere una, eliminare fino al prossimo commento)

Inoltre, non è ciò che si desidera in questo caso, probabilmente, ma in abbastanza recenti versioni di git, c'è un identificatore fixup che puoi usare al posto dello squash: fa la stessa cosa, ma scarta il messaggio di commit, quindi se hai un commit con il messaggio reale e poi dieci correzioni, puoi semplicemente segnare tutte le correzioni e non devono cancellare i loro messaggi usa e getta.

+0

Sono d'accordo. +1. Per ulteriori informazioni su fixup (e autosquashing), vedi http://stackoverflow.com/questions/2302736/trimming-git-checkins/2302947#2302947 – VonC

+0

Cool! Dovrò aggiornare msysgit e dare questa correzione e una tale ripresa. :) – adamjford

+0

Ho iniziato a usare Vim per i miei shenanigans di modifica del testo, quindi suppongo che vada con la porta # 2! – adamjford

0

È possibile effettuare un --amend quando si desidera. Puoi effettuare il checkout in commit prima di impegnarti per il cambiamento e modificarlo.

+0

Sì, e io uso - un bel po 'perché ho dita grasse, a quanto pare. :) Ma non ho bisogno di --amend i miei commit schiacciati per modificare il messaggio di commit risultante; Ho appena formattato l'editor di testo che appare dopo aver assegnato pick/edit/squash a ogni commit. Ho chiarito la mia domanda per spiegare questo. – adamjford

9

A partire da Git 2.6+ (Q3 2015), ci sarà in realtà un modo per configurare git rebase -i messaggio di commit.

Vedere commit 16cf51c (13 Jun 2015) entro il Michael Rappazzo (rappazzo).
(fusa per Junio C Hamano -- gitster -- in commit 9f56db7 03 ago 2015)

git-rebase--interactive.sh: opzione di configurazione aggiungere per il formato di istruzione personalizzato

un'opzione di configurazione 'rebase.instructionFormat' può ignorare l'impostazione predefinita 'oneline' formato del rebase lista di istruzioni.

Poiché l'elenco viene analizzato utilizzando il segno di sinistra, destra o di confine più lo sha1, vengono anteposti al formato dell'istruzione.

si avrà presto una nuova configurazione:

rebase.instructionFormat 

Una stringa di formato, come specificato nella git log, da utilizzare per la lista di istruzioni durante un rebase interattivo.
Il formato avrà automaticamente inserito l'hash del commit lungo nel formato.

Ad esempio:

git config --add rebase.instructionFormat "[%an @ %ar] %s" 

notare che c'è un bug/di regressione dopo il rilascio di tale caratteristica:
Vedere "Comment in rebase instruction has become too rigid"

ho notato che il formato delle righe di commento in un foglio di istruzioni di rebase è diventato più rigoroso - non è più possibile iniziare con spazi o tabulazioni. Il commento char ("#" per esempio) deve apparire sulla prima colonna.


Jefromi commenti below:

sembra è il solo scopo di influenzare la visualizzazione all'interno rebase interattivo, non il conseguente messaggi di commit.

Ho fatto un tentativo con la stringa di formato di esempio e in effetti ho visto le informazioni dell'autore nel mio editor, ma una volta che l'ho detto di schiacciare, il messaggio di commit del template risultante era ancora il solito.

Quindi questo non è perfetto per l'OP.

+0

Qualcuno mi ha detto che la mia risposta era sbagliata ora, quindi ho dato un'occhiata a questo: sembra che sia inteso solo per influenzare la visualizzazione all'interno di rebase interattivo, non i messaggi di commit risultanti. Ho fatto un tentativo con la stringa di formato di esempio e ho visto le informazioni dell'autore nel mio editor, ma una volta che l'ho detto di fare lo squash, il messaggio di commit del template risultante era sempre il solito. – Cascabel

+0

@Jefromi Buon punto. Ho incluso il tuo commento nella risposta per maggiore visibilità. E ho aggiunto un commento alla domanda affermando che la tua risposta è ancora quella. – VonC

Problemi correlati