La réponse actuellement acceptée est techniquement correcte, vous ne pouvez pas dire directement à Git de pousser toutes vos cachettes vers une télécommande, puis de tout ranger dans vos cachettes locales sur un autre ordinateur.
Et bien que la réponse actuellement notée devrait fonctionner, je n'aimais pas qu'elle crée un tas de branches temporaires et qu'elle nécessite de vérifier manuellement le commit de la sauvegarde et de l'enregistrer en tant que cache, ce qui peut entraîner des problèmes comme ce commentaire mentionné , et conduit à un doublon On (no branch): On testing:
. Il doit certainement exister un meilleur moyen!
Donc, bien que vous ne puissiez pas pousser directement les stashes, un stash est juste un commit (en fait deux commits), et selon la git push
page de manuel, vous pouvez pousser les commits:
C'est <src>
souvent le nom de la branche que vous souhaitez pousser, mais il peut s'agir de n'importe quelle "expression SHA-1" arbitraire ...
J'ai choisi de pousser les cachettes pour refs/stashes/*
ne pas encombrer ma télécommande avec des branches supplémentaires. Je peux donc le faire avec:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
(La rev-parse
commande obtient le hachage court de la cachette, qui sera unique pour le dépôt.)
Ensuite, je dois récupérer la cachette de l'autre ordinateur. Git ne récupère que les branches par défaut, j'ai donc besoin de récupérer les stashes spécifiquement:
git fetch origin refs/stashes/*:refs/stashes/*
Maintenant, reconvertissez la validation de la sauvegarde en une sauvegarde réelle. Comme mentionné, bien que je puisse simplement vérifier la validation, la réinitialisation et la sauvegarde de la cachette comme d'habitude, je n'aime pas que cela nécessite des étapes supplémentaires, ou qu'il ne puisse pas maintenir l'état d'index pour la cachette. Je cherchais en ligne un moyen de le faire automatiquement, mais ma recherche-fu m'a échoué. Enfin, j'ai cherché dans la page de manuel git stash
, où j'ai trouvé ceci:
create
Crée une cachette (qui est un objet de validation normal) et renvoie son nom d'objet, sans la stocker n'importe où dans l'espace de noms ref. Ceci est destiné à être utile pour les scripts. Ce n'est probablement pas la commande que vous souhaitez utiliser; voir "enregistrer" ci-dessus.
store
Stocke un stash donné créé via git stash create (qui est un commit de fusion pendant) dans la référence de stash, mettant à jour le reflog de stash. Ceci est destiné à être utile pour les scripts. Ce n'est probablement pas la commande que vous souhaitez utiliser; voir "enregistrer" ci-dessus.
Puisque j'ai déjà le commit, store
ça sonne comme ce que je veux. Je peux donc faire:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Remplacer <SHA>
par la cachette qui venait d'être récupérée.
(La git show
commande obtient le message de validation du commit de sauvegarde, à utiliser comme message pour le journal de sauvegarde.)
La cachette apparaît maintenant comme normale dans mon référentiel local:
$ git stash list
stash@{0}: On master: temp
...
Pour nettoyer la télécommande, les cachettes peuvent être supprimées de la télécommande comme suit:
git push origin :refs/stashes/<SHA>
Cette méthode a également l'avantage d'être idempotente: si vous exécutez à push
nouveau la commande, elle fera rapport Everything up-to-date
. La fetch
commande peut également être exécutée en toute sécurité à plusieurs reprises. Bien que le stash store
saute le stockage de la cachette s'il est identique à la cachette la plus récente, il n'empêche pas les doublons d'anciennes cachettes. Cela peut être contourné cependant, comme je le fais dans mon git-rstash
script, voir ci-dessous.
Pour terminer, vous pouvez également facilement pousser tous les masques (avec frapper):
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
ou importez tous les stashes récupérés:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
J'ai créé un frapperscript qui peut être appelé comme une sous-commande (par exemple git rstash push 0
) donc je n'ai pas à me souvenir de tout cela. git-rstash
peut être trouvé ici.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
legit stash apply some-remote/stash
. Mais vous ne pouvez pas obtenir d'anciennes cachettes car elles sont stockées dans le reflog qui n'est pas récupérable. Voir stackoverflow.com/questions/2248680/…