Dans git, est-il possible de créer une cachette, de la pousser vers un référentiel distant, de récupérer la cachette sur un autre ordinateur et d'appliquer la cachette?
Ou sont mes options:
- Créez un correctif et copiez-le sur l'autre ordinateur, ou
- Créer une branche mineure et valider le travail incomplet dans cette branche?
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/…Remarque: Je viens de réécrire cette réponse avec 24 heures de plus de git-fu à mon actif :) Dans mon histoire de coquille, le shebang entier est maintenant composé de trois lignes simples. Cependant, je ne les ai pas condensés pour votre commodité.
De cette façon, j'espère que vous pourrez voir comment j'ai fait les choses, au lieu de simplement avoir à copier / coller des choses à l'aveugle.
Voici étape par étape.
Supposons que la source dans ~ / OLDREPO contient des cachettes. Créez un clone TEST ne contenant pas de stashes:
Poussez toutes les cachettes en tant que branches temporaires:
Boucle sur l'extrémité réceptrice pour se retransformer en cachettes:
Nettoyez vos succursales temporaires si vous le souhaitez
Faites une liste cachée de git et vous obtiendrez quelque chose comme ceci:
Sur le référentiel d'origine, le même aspect
la source
git add .
avant l'git stash save ...
étape, car ilgit stash
refuse de cacher de nouveaux fichiers à moins qu'ils n'aient été mis en scène. De plus, la canalisation du résultat degit rev-list ...
throughtac
inverse l'ordre des stashes afin qu'ils sortent dans le même ordre.for
boucle finale avecgit branch -D stash_$a
(nettoyer au fur et à mesure que les stashes sont créés) afin que si quelque chose ne va pas et que nous réessayions, nous ne retraitions pas les validations déjà stashées avec succès.git stash save "$(git log --format='%s' -1 HEAD@{1})"
par,git update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
vous obtenez le message de sauvegarde d'origine (update-ref
c'est ce qui se passegit stash save
dans les coulisses).Je suis un peu en retard à la fête, mais je pense avoir trouvé quelque chose qui fonctionne pour moi à ce sujet et cela pourrait vous plaire aussi si vos circonstances sont identiques ou similaires.
Je travaille sur une fonctionnalité dans sa propre branche. La branche n'est pas fusionnée en master et poussée jusqu'à sa fin ou j'ai fait des commits que je me sens à l'aise de montrer au public. Donc, ce que je fais quand je veux transférer des modifications non échelonnées vers un autre ordinateur, c'est:
[non-commit] FOR TRANSFER ONLY
", présentant le contenu que vous souhaitez transférer.Alors fais:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
L'URL peut différer pour vous si vous accédez à votre référentiel d'une manière différente. Cela va extraire les modifications de cette URL de la branche distante "rb" dans la branche locale "lb". Notez que j'ai un serveur ssh exécuté sur mon propre ordinateur et que je peux accéder au référentiel de cette façon.
git reset HEAD^
(implique--mixed
)Cela réinitialise le HEAD pour pointer vers l'état avant le commit "[non-commit]".
De git-reset (1): "
--mixed
: réinitialise l'index mais pas l'arborescence de travail (c'est-à-dire que les fichiers modifiés sont conservés mais pas marqués pour validation) [...]"Ainsi, vous aurez vos modifications aux fichiers à la fin, mais aucune validation n'est effectuée pour le master et pas besoin de stash.
Cela vous obligera cependant à le faire
git reset --hard HEAD^
dans le référentiel dans lequel vous avez fait le "[non-commit]", car ce commit est une ordure.la source
Il est un peu tard, mais cette réponse pourrait aider quelqu'un. Je voulais savoir cela parce que je voulais être en mesure de pousser une fonctionnalité / bug / quoi que ce soit en cours et de travailler à partir du même point sur un autre ordinateur.
Ce qui fonctionne pour moi, c'est de valider mon code en cours (dans une branche sur laquelle je travaille seul). Quand j'arrive à mon autre ordinateur, faites un pull, puis annulez le commit avec:
Continuez à travailler tel que vous étiez, avec tous vos changements en cours, non validés et non planifiés.
J'espère que ça aide.
la source
Il semble y avoir une astuce très soignée pour résoudre ce problème. vous pouvez utiliser
git diff > file.diff
(et valider le fichier), puis restaurer les modifications à l'aidegit apply file.diff
(de n'importe où) pour obtenir le même résultat.Cela a également été expliqué ici .
la source
J'irais avec la deuxième approche bien que je ne sache pas pourquoi vous ne pouvez pas le valider dans la branche master / sélectionnée. Il est également possible de faire de la cueillette.
la source
AFAIK l'idée de la cachette est de cacher quelque chose de moins important sous le tapis local . Personne ne devrait connaître votre merde préférée ;-) Le seul "mais" est: Mais si je développe sur quelques postes de travail? Alors
scp
c'est bien mieux.la source
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: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:(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:
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:Puisque j'ai déjà le commit,
store
ça sonne comme ce que je veux. Je peux donc faire: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:
Pour nettoyer la télécommande, les cachettes peuvent être supprimées de la télécommande comme suit:
Cette méthode a également l'avantage d'être idempotente: si vous exécutez à
push
nouveau la commande, elle fera rapportEverything up-to-date
. Lafetch
commande peut également être exécutée en toute sécurité à plusieurs reprises. Bien que lestash 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 mongit-rstash
script, voir ci-dessous.Pour terminer, vous pouvez également facilement pousser tous les masques (avec frapper):
ou importez tous les stashes récupérés:
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.la source
Ce qui suit ne fonctionne pas avec la stash, mais avec les modifications non validées dans le répertoire de travail. Il crée une branche, valide automatiquement toutes les modifications en cours et envoie à la télécommande:
Utilisez comme:
la source
Je voudrais simplement créer une nouvelle branche cachée et la supprimer chaque fois que cette branche n'est pas requise.
la source
Utilisez simplement Dropbox comme ce type. De cette façon, vous n'avez pas à vous soucier de pousser les stashes car tout votre code serait sauvegardé.
http://blog.sapegin.me/all/github-vs-dropbox
la source