ver tag oneline modificados log archivos git git-stash refs

tag - Git comando para guardar un alijo sin modificar el árbol de trabajo?



git tag (3)

He querido usar un comando git que guarda un alijo sin modificar mi árbol de trabajo, como una copia de seguridad liviana que está a salvo de cualquier reinicio de git o lo que sea que pueda hacer para arruinar mi índice. Básicamente, se aplica el equivalente funcional de "git stash save && git stash", excepto que la copia de trabajo nunca se toca, ya que esto puede hacer que ciertos editores de texto / IDE estén malhumorados.

Algo así se está acercando a lo que quiero, pero no del todo:

git update-ref refs/stash `git stash create "Stash message"`

Esto funciona de manera funcional, pero el problema que estoy teniendo es que no aparece ningún mensaje oculto en "git stash list", aunque la confirmación real oculta contiene mi mensaje. Considerando lo grande que puede ser un alijo, los mensajes ocultos son muy importantes.


Debe pasar el mensaje a update-ref , no a stash create ya que stash create no recibe un mensaje (no actualiza ninguna referencia, por lo que no tiene entrada de reflog para rellenar).

git update-ref -m "Stash message" refs/stash "$(git stash create)"


Gracias a la sugerencia de Charles, abrí un script bash para hacer exactamente lo que quería (me encontré con problemas al implementar esto como solo un alias). Se necesita un mensaje oculto opcional como guardar guardado git. Si no se proporciona ninguno, usará el mensaje predeterminado generado por git stash.

#!/bin/sh # # git-stash-snap # Save snapshot of working tree into the stash without modifying working tree. # First argument (optional) is the stash message. if [ -n "$1" ]; then git update-ref -m "$1" refs/stash "$(git stash create /"$1/")" else HASH=`git stash create` MESSAGE=`git log --no-walk --pretty="tformat:%-s" "$HASH"` git update-ref -m "$MESSAGE" refs/stash "$HASH" fi

Editar: Como se señala en un comentario a continuación, guardar este script como git-stash-snap en algún lugar de su ruta es suficiente para poder invocarlo escribiendo git stash-snap .

Lo bueno de esto es que, incluso si deja un alijo hecho con este método, ¡aún podrá ver el mensaje oculto usando git log [commit-hash] del commit suspendido!

Editar: desde git 2.6.0 puedes agregar --create-reflog para update-ref y luego la git stash list mostrará esto incluso si git stash no se usó antes.

Editar: Git introdujo un nuevo subcomando oculto llamado " stash push así que actualicé mi recomendación para nombrar este guión de git-stash-push a git-stash-snap .


Inspirado por la solución de Eliot, extendí un poco su guión:

#!/bin/sh # # git-stash-push # Push working tree onto the stash without modifying working tree. # First argument (optional) is the stash message. # # If the working dir is clean, no stash will be generated/saved. # # Options: # -c "changes" mode, do not stash if there are no changes since the # last stash. if [ "$1" == "-c" ]; then CHECK_CHANGES=1 shift fi if [ -n "$1" ]; then MESSAGE=$1 HASH=$( git stash create "$MESSAGE" ) else MESSAGE=`git log --no-walk --pretty="tformat:%-s" "HEAD"` MESSAGE="Based on: $MESSAGE" HASH=$( git stash create ) fi if [ "$CHECK_CHANGES" ]; then # "check for changes" mode: only stash if there are changes # since the last stash # check if nothing has changed since last stash CHANGES=$( git diff stash@{0} ) if [ -z "$CHANGES" ] ; then echo "Nothing changed since last stash." exit 0 fi fi if [ -n "$HASH" ]; then git update-ref -m "$MESSAGE" refs/stash "$HASH" echo "Working directory stashed." else echo "Working tree clean, nothing to do." fi

Implementé los siguientes cambios en el script de Eliot:

  1. Cuando el trabajo de dir está limpio, el script saldrá con gracia
  2. Cuando se utiliza el conmutador -c , si no hay cambios en comparación con el último alijo, el script se cerrará. Esto es útil si usa este script como una "máquina del tiempo", haciendo un alijo automático cada 10 minutos. Si nada ha cambiado, no se crea ningún nuevo alijo. Sin este cambio, puede terminar con n depósitos consecutivos que son iguales.

No es que para que el conmutador -c funcione correctamente, debe existir al menos un alijo, de lo contrario, el script arroja un error en git diff stash@{0} y no hará nada.

Utilizo esta secuencia de comandos como una "máquina del tiempo", tomando instantáneas cada 10 minutos usando el siguiente ciclo bash:

while true ; do date ; git stash-push ; sleep 600 ; done