2011-07-08 30 views
7

Quiero asegurarme de que mi última confirmación tenga la fecha actual antes de presionar. Ya que siempre rebase a dominar antes de una fusión + empuje, hice este alias:git alias con el parámetro opcional

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

El problema es que sigue lanzando mi editor de texto pidiendo un nuevo mensaje de confirmación. ¿Hay una manera de tener un parámetro opcional, para que pueda elegir el uso de:

git sync 'my commit message' 

o

git sync 

donde este último sólo tiene que utilizar el vigente el mensaje del informe, lo que pasa a ser ?

+0

Posible duplicado de http://stackoverflow.com/q/3321492/923794 – cfi

Respuesta

12

Para aplicar los parámetros adicionales a cualquier cosa que no sea el final de la "línea de comando" de su alias, deberá colocar los comandos de la shell en una secuencia de comandos. Puede hacerlo con un script externo (como jdelStrother’s answer), o puede hacerlo con un script de shell "en línea".

Se puede utilizar para alimentar -mgit commit su mensaje nuevo o utilice la opción -C HEAD/--reuse-message=HEAD tener que utilizar el mensaje y autor existente (que también podría volver a utilizar la marca de tiempo autor, pero que está restableciendo con --date=…). El uso de cualquiera de estas opciones evitará que Git abra un editor para su mensaje de confirmación.

Aquí es como una “línea” shell script:

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

El núcleo de este pequeño script es el par de expansiones de parámetros condicionales:

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

Cuando se llama con un extra parámetro (es decir, su mensaje de registro de reemplazo), estos se expanden a dos palabras de shell: -m "<your new log message>". Cuando no proporciona el parámetro adicional, se expande a una sola palabra: "--reuse-message=HEAD".

El tramo final también es importante; podría ser cualquier palabra de shell, el punto es que algo debe estar allí porque el shell lo usará para inicializar su parámetro $0 (que generalmente tiene un valor predeterminado, por lo que es inútil para la expansión condicional en sí).


Si no he entendido bien y que realmente quieren ver el editor cuando no se proporciona el parámetro adicional, a continuación, utilizar la única expansión ${1+-m "$1"} en lugar del par de expansiones.

+0

--reuse-message = HEAD es justo lo que estaba buscando, sin embargo, el script no funciona como esperaba. El comando commit parece usar el mensaje existente independientemente de si proporciono un parámetro, y el comando rebase siempre regresa con un error: cuando no se proporciona ningún parámetro me sale 'fatal: se necesita una única revisión upstream master no válido' Cuando un parámetro se suministra consigo 'Uso: git rebase ...' – ceramica

+0

@ceramica Funciona para mí (ambos dando un mensaje nuevo y reutilizando el mensaje anterior, así como la subsiguiente rebase), pero tengo que usar algo además de '- date = today', ya que eso no es válido. Usé '--date =" $ (date "+% s% z") "' en su lugar - el comando exacto que utilicé para crear el alias (que me funciona) es '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 conseguí que funcionara pero tuve que cambiar manualmente el alias en mi .gitconfig a: '"! Sh -c 'git commit --mend --date = today $ {1 + -m} \ "$ {1 --- reuse-message = HEAD} \ "; git rebase master '-" 'No sé por qué necesita las comillas adicionales, pero la necesidad de'; 'separar los comandos sugiere que la primera está fallando. Sin embargo, parece funcionar bien. – ceramica

6

Cuando sus alias comienzan a ser más complejos, probablemente sea más fácil crear un script separado para ellos. Si agrega un archivo 'git-sync' a su ruta, se le llamará automáticamente cuando haga 'git sync'.

Por lo tanto, si ha creado ese archivo con algo en la línea de -

#!/bin/sh 

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

- que probablemente iba a funcionar. Sin embargo, está tipeado de la parte superior de mi cabeza, así que haz una advertencia.

+0

La idea es sólida, pero este script no realiza la ejecución condicional ('&&') como el código original del OP. –

Cuestiones relacionadas