2011-07-08 25 views
7

Voglio assicurarmi che il mio ultimo commit abbia la data corrente prima di premere. Dal momento che ho sempre REBASE a padroneggiare prima di una fusione + spinta, ho fatto questo alias:git alias con parametro opzionale

[alias] 
    sync = !git commit --amend --date=today && git rebase master 

Il problema è che continua a lanciare il mio editor di testo per chiedere un nuovo messaggio di commit. C'è un modo per avere un parametro opzionale, in modo che possa scegliere di utilizzare:

git sync 'my commit message' 

o

git sync 

in cui quest'ultimo è sufficiente utilizzare l'attuale messaggio di commit, qualunque essa sembra essere ?

+0

Possibile duplicato di http://stackoverflow.com/q/3321492/923794 – cfi

risposta

12

Per applicare i parametri aggiuntivi a qualsiasi cosa tranne la fine della "riga di comando" dell'alias, è necessario inserire i comandi della shell in uno script. Puoi farlo con uno script esterno (come jdelStrother’s answer), oppure puoi farlo con uno script di shell "in linea".

È possibile utilizzare -m per alimentare git commit il nuovo messaggio o utilizzare l'opzione -C HEAD/--reuse-message=HEAD di averlo utilizzare il messaggio e autore esistente (sarebbe anche riutilizzare il timestamp autore, ma si sta reimpostando che con --date=…). L'utilizzo di una di queste opzioni impedirà a Git di aprire un editor per il tuo messaggio di commit.

Qui è come un “inline” script di shell:

git config --global alias.sync '!sh -c '\''git commit --amend --date=today ${1+-m} "${1---reuse-message=HEAD}" && git rebase master'\'' -' 

Il nucleo di questo piccolo script è la coppia di espansioni di parametri condizionali:

${1+-m} "${1---reuse-message=HEAD}" 

Quando si chiama con un extra parametro (cioè il tuo messaggio di log di sostituzione), questi si espandono in due parole di shell: -m "<your new log message>". Quando non si fornisce il parametro extra, si espandono su una singola parola: "--reuse-message=HEAD".

Anche il trattino finale è importante; potrebbe essere qualsiasi parola di shell, il punto è che qualcosa deve essere lì perché la shell lo userà per inizializzare il suo parametro $0 (che di solito ha un valore predefinito, quindi è inutile per l'espansione condizionale stessa).


Se ho capito male e che in realtà vogliono vedere l'editor quando non si specifica il parametro in più, quindi utilizzare il singolo espansione ${1+-m "$1"} al posto della coppia di espansioni.

+0

--reuse-message = HEAD è proprio quello che stavo cercando, tuttavia lo script non funziona come mi aspettavo. Il comando commit sembra utilizzare il messaggio esistente indipendentemente dal fatto che fornisca un parametro, e il comando rebase restituisce sempre un errore: quando non viene fornito alcun parametro ottengo "fatale: necessario una singola revisione master upstream non valido" Quando un parametro viene fornito I get 'Usage: git rebase ...' – ceramica

+0

@ceramica Funziona per me (sia dando un nuovo messaggio e riutilizzando il vecchio messaggio, sia il successivo rebase), ma devo usare qualcosa oltre a '- date = today', poiché non è valido. Ho usato '--date =" $ (date "+% s% z") "' invece - il comando esatto che ho usato per creare l'alias (che funziona per me) è 'git config --global alias.sync ' ! sh -c '\' 'git commit --amend --date = "$ (date" +% s% z ")" $ {1 + -m} "$ {1 --- reuse-message = HEAD} "&& git rebase master '\' '-''. –

+0

Finalmente ho funzionato, ma ho dovuto modificare manualmente l'alias nel mio .gitconfig in: ""! Sh -c 'git commit --amend --date = oggi $ {1 + -m} \ "$ {1 --- reuse-message = HEAD} \ "; git rebase master '-" 'Non so perché ha bisogno delle virgolette extra, ma la necessità di'; 'separare i comandi suggerisce che il primo non funzioni. Tuttavia, sembra funzionare bene. – ceramica

6

Quando i tuoi alias iniziano a diventare più complessi, è probabilmente più semplice creare semplicemente uno script separato. Se aggiungi un file 'git-sync' al tuo percorso, verrà chiamato automaticamente quando esegui 'git sync'.

Quindi, se avete creato il file con qualcosa sulla falsariga di -

#!/bin/sh 

if [ -z "$1" ]; then 
    git commit --amend --date=today 
else 
    git commit --amend --date=today -m "$1" 
fi 
git rebase master 

- che probabilmente funzionerà. Tuttavia, è stato battuto in cima alla mia testa, quindi mi raccomando.

+0

L'idea è valida, ma questo script non esegue l'esecuzione condizionale ('&&') come il codice originale dell'OP. –