2008-11-17 20 views
9

La sección Últimos enlaces en la cadena: El almacenamiento y la modificación en http://ftp.newartisans.com/pub/git.from.bottom.up.pdf recomienda guardar a menudo para tomar instantáneas de su trabajo en progreso. El autor va tan lejos como recomienda que pueda usar un trabajo cron para esconder su trabajo regularmente, sin tener que hacer un alijo de forma manual.Ocultación automática

La belleza de escondite es que permite aplicar el control de versión discreta a su trabajo proceso en sí mismo: es decir, las distintas etapas de su árbol de trabajo de día a día. Incluso puede utilizar alijo de forma regular si se quiere, con algo parecido a la escritura siguiente instantánea:

$ cat <<EOF > /usr/local/bin/git-snapshot 
#!/bin/sh 
git stash && git stash apply 
EOF 
$ chmod +x $_ 
$ git snapshot 

No hay razón para que no podría funcionar esto desde un trabajo cron cada hora, junto con el funcionamiento de la reflog expire el comando cada semana o mes.

El problema con este enfoque es:

  1. Si no hay cambios en su copia de trabajo, "se aplican alijo git" la hará que su último escondite a ser aplicado sobre su copia de trabajo.
  2. Puede haber condiciones de carrera entre el momento en que se ejecuta la tarea cron y el usuario que trabaja en la copia de trabajo. Por ejemplo, se ejecuta "git stash", luego el usuario abre el archivo y luego se ejecuta el "git stash apply" del script.

¿Alguien tiene alguna sugerencia para hacer que este almacenamiento automático funcione de manera más confiable?

+0

Su enlace en la parte superior se rompe. La url es: http://www.newartisans.com/2008/04/git-from-the-bottom-up.html – Colin

+0

SO no me deja borrar mi comentario, pero estaba equivocado. El enlace es en realidad http://ftp.newartisans.com/pub/git.from.bottom.up.pdf – Colin

+0

Gracias - actualizó el enlace. – Readonly

Respuesta

13

Ciertamente no configuré el almacenamiento automático como se describe en ese artículo (por lo demás excelente), por exactamente las razones que cita.

Prefiero usar el alijo como está destinado a ser usado, donde oculto y aplico cambios deliberadamente mientras trabajo. Para las copias de seguridad periódicas, utilizo una solución de copia de seguridad adecuada. En mi opinión, Git no es un sustituto de una solución de respaldo.

8

git stash es en realidad solo un pequeño script de shell que crea una confirmación que no se referencia en ninguna rama. Se podría emular este comportamiento sin condiciones de carrera:

#!/bin/sh 
GIT_DIR=$(git rev-parse --git-dir) || exit 
ref_stash=refs/stash 

w_commit=$(git stash create) # creates a commit for the wip 

# gather some info 
head=$(git log --no-color --abbrev-commit --pretty=oneline -n 1 HEAD --) 
branch=$(git symbolic-ref -q HEAD) 
branch=${branch#refs/heads/} 
msg=$(printf 'WIP on %s: %s' "$branch" "$head") 

# Make sure the reflog for stash is kept. 
: >>"$GIT_DIR/logs/$ref_stash" 

git update-ref -m "$msg" $ref_stash $w_commit 

La secuencia de comandos puede necesitar un poco de pulido, pero espero que la idea :)

+0

Parece que la secuencia de comandos funciona y puedo ver que es útil si desea guardar sus cambios de trabajo sin volver a HEAD. Estoy convencido por la respuesta de Greg de que no debemos confiar en esto para propósitos de 'copia de seguridad' aunque :) – Readonly

2

prefiero gestión rama antes de gestión escondite: echar un vistazo here

1

Para realizar una copia de seguridad, recomendaría el servicio de copia de seguridad en línea, similar a dropbox.com Literalmente no necesita hacer nada, solo hace un seguimiento de todos los cambios que realiza durante el día.

Lo tengo habilitado para todos mis repositorios git, lo que me ayuda a centrarme en la tarea real.

3

Para mi uso personnal (trabajo con que durante 3 años), he añadido esta línea en la sección de alias config:

s = !sh -c \"git stash save | grep 'No local changes to save' && git $* || (git $* && git stash pop) \" 

Entonces, puedo ejecutar todos los comandos git con stashing automático sólo mediante la adición de una 's' antes.Al igual que en su caso: git s snaspshot

Tal vez demasiado tarde, pero espero que ayude a alguien, un día ...

Cuestiones relacionadas