La respuesta actualmente aceptada es técnicamente correcta, no puede decirle directamente a Git que empuje todas sus reservas a un control remoto y luego tire todo a sus reservas locales en otra computadora.
Y aunque la respuesta votada en la actualidad debería funcionar, no me gustó que cree un montón de ramas temporales, y que requiera verificar manualmente la confirmación de almacenamiento y guardarla como un alijo, lo que puede conducir a problemas como este comentario mencionado , y conduce a un duplicado On (no branch): On testing:
. ¡Seguramente debe haber una mejor manera!
Por lo tanto, si bien no puede empujar escondites directamente, un escondite es solo una confirmación (en realidad dos confirmaciones), y según la git push
página de manual, puede empujar confirmaciones:
A <src>
menudo es el nombre de la rama que desea empujar, pero puede ser cualquier "expresión SHA-1" arbitraria ...
Elegí empujar los escondites para refs/stashes/*
no abarrotar mi control remoto con ramas adicionales. Entonces puedo hacer eso con:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
(El rev-parse
comando obtiene el hash corto del alijo, que será único para el repositorio).
A continuación, necesito buscar el alijo de la otra computadora. Git solo busca ramas de forma predeterminada, por lo que necesito buscar las reservas específicamente:
git fetch origin refs/stashes/*:refs/stashes/*
Ahora, para convertir el alijo, vuelva a comprometerse en un alijo real. Como se mencionó, si bien podría verificar el compromiso de ocultamiento, restablecimiento y ocultamiento como de costumbre, no me gusta que requiera pasos adicionales o que no pueda mantener el estado de índice para el ocultamiento. Estaba buscando en línea una forma de hacerlo automáticamente, pero mi búsqueda fué fallando. Finalmente busqué en la página del manual git stash
, donde encontré esto:
create
Cree un alijo (que es un objeto de confirmación regular) y devuelva su nombre de objeto, sin almacenarlo en ningún lugar del espacio de nombres de referencia. Esto está destinado a ser útil para los scripts. Probablemente no sea el comando que desea usar; ver "guardar" arriba.
store
Almacene un alijo dado creado a través de git stash create (que es una confirmación de fusión pendiente) en la reserva de reserva, actualizando el registro de reserva. Esto está destinado a ser útil para los scripts. Probablemente no sea el comando que desea usar; ver "guardar" arriba.
Como ya tengo el commit, store
suena como lo que quiero. Entonces puedo hacer:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Reemplazar <SHA>
con el alijo que acaba de ser traído.
(El git show
comando obtiene el mensaje de confirmación del depósito oculto, para usarlo como mensaje para el registro oculto).
El alijo ahora aparece como normal en mi repositorio local:
$ git stash list
stash@{0}: On master: temp
...
Para limpiar el control remoto, las reservas se pueden eliminar del control remoto de la siguiente manera:
git push origin :refs/stashes/<SHA>
Este método también tiene el beneficio de ser idempotente: si ejecuta el push
comando nuevamente, informará Everything up-to-date
. El fetch
comando también se puede ejecutar de forma segura repetidamente. Si bien stash store
saltará el almacenamiento del alijo si es el mismo que el alijo más reciente, no evita duplicados de alijos más antiguos. Sin embargo, esto se puede solucionar, como lo hago en mi git-rstash
script, ver a continuación.
Para completar, también puede empujar fácilmente todos los escondites (con intento):
for i in $(seq 0 $(expr $(git rev-list --walk-reflogs --count stash) - 1))
do
git push origin stash@{$i}:refs/stashes/$(git rev-parse --short stash@{$i})
done
o importar todos los escondites recuperados:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
He creado un intentoscript que se puede llamar como un subcomando (por ejemplo git rstash push 0
) para que no tenga que recordar todo esto. git-rstash
Se puede encontrar aquí.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
elgit stash apply some-remote/stash
. Pero no puede obtener escondites más antiguos porque están almacenados en el registro que no es recuperable. Ver stackoverflow.com/questions/2248680/…