web-dev-qa-db-fra.com

Est-il possible de transférer une réserve git dans un référentiel distant?

Dans git, est-il possible de créer une cachette, de pousser la cachette dans 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 patch et copiez-le sur l’autre ordinateur, ou
  • Créer une branche mineure et confier le travail incomplet à cette branche?
180
Andrew Grimm

Il n'est pas possible de l'obtenir via fetch, le refspec du miroir est fetch = +refs/*:refs/*, Et même si stash est refs/stash, Il n'est pas envoyé. Un refs/stash:refs/stash Explicite n'a aucun effet non plus!

De toute façon, ce ne serait que déroutant, car cela ne chercherait pas toutes les cachettes, seulement la dernière. la liste des stash est le reflog de la référence refs/stashes.

60
u0b34a0f6ae

Note: Je viens de réécrire cette réponse avec 24 heures de plus de git-fu à mon actif :) Dans mon histoire Shell, tout le Shebang est maintenant composé de trois personnes. Cependant, je les ai dissous pour votre commodité.

De cette façon, j'espère que vous pourrez voir comment j'ai fait les choses, au lieu de simplement copier/coller à l'aveuglette.


Voici étape par étape.

Supposer que la source est dans ~/OLDREPO contenant des caches. Créez un clone TEST ne contenant pas de stash:

cd ~/OLDREPO
git clone . /tmp/TEST

Poussez tous les stash comme des branches temporaires:

git send-pack /tmp/TEST $(for sha in $(git rev-list -g stash); \
    do echo $sha:refs/heads/stash_$sha; done)

Boucle à la réception pour reconvertir en caches:

cd /tmp/TEST/
for a in $(git rev-list --no-walk --glob='refs/heads/stash_*'); 
do 
    git checkout $a && 
    git reset HEAD^ && 
    git stash save "$(git log --format='%s' -1 HEAD@{1})"
done

Nettoyez vos branches temporaires si vous voulez

git branch -D $(git branch|cut -c3-|grep ^stash_)

Faites une liste cachée git et vous obtiendrez quelque chose comme ceci:

stash@{0}: On (no branch): On testing: openmp import
stash@{1}: On (no branch): On testing: zfsrc
stash@{2}: On (no branch): WIP on sehe: 7006283 fixed wrong path to binary in debianized init script (reported as part of issue
stash@{3}: On (no branch): WIP on debian-collab: c5c8037 zfs_pool_alert should be installed by default
stash@{4}: On (no branch): WIP on xattrs: 3972694 removed braindead leftover -O0 flag
stash@{5}: On (no branch): WIP on testing: 3972694 removed braindead leftover -O0 flag
stash@{6}: On (no branch): WIP on testing: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{7}: On (no branch): WIP on xattrs: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{8}: On (no branch): WIP on testing: 28716d4 fixed implicit declaration of stat64
stash@{9}: On (no branch): WIP on emmanuel: bee6660 avoid unrelated changes

Sur le référentiel d'origine, le même ressemblait

stash@{0}: WIP on emmanuel: bee6660 avoid unrelated changes
stash@{1}: WIP on testing: 28716d4 fixed implicit declaration of stat64
stash@{2}: WIP on xattrs: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{3}: WIP on testing: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{4}: WIP on testing: 3972694 removed braindead leftover -O0 flag
stash@{5}: WIP on xattrs: 3972694 removed braindead leftover -O0 flag
stash@{6}: WIP on debian-collab: c5c8037 zfs_pool_alert should be installed by default
stash@{7}: WIP on sehe: 7006283 fixed wrong path to binary in debianized init script (reported as part of issue #57)
stash@{8}: On testing: zfsrc
stash@{9}: On testing: openmp import
70
sehe

Je suis un peu en retard à la fête, mais je pense avoir trouvé quelque chose qui fonctionne pour moi à ce sujet et que cela pourrait aussi être pour vous si votre situation est identique ou similaire.

Je travaille sur une fonctionnalité dans sa propre branche. La branche n’a pas été fusionnée avec master et n’a pas été poussée jusqu’à ce qu’elle soit terminée ou que j’ai pris des engagements que je me sens à l’aise de montrer au public. Donc, ce que je fais lorsque je veux transférer des modifications non mises en scène sur un autre ordinateur est:

  • Faites un commit, avec un message de type "[non-commit] FOR TRANSFER ONLY ", avec le contenu que vous souhaitez transférer.
  • Connectez-vous à l'autre ordinateur.
  • 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 différemment. Cela extraira les modifications de cette URL de la branche distante "rb" vers la branche locale "lb". Notez que j'ai un serveur ssh fonctionnant 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 qu'il pointe vers l'état précédant le commit "[non-commit]".

Depuis git-reset (1): "--mixed: Réinitialise l’index mais pas l’arbre de travail (c’est-à-dire que les fichiers modifiés sont préservés mais ne sont pas marqués pour la validation) [...] "

Donc, vous aurez vos modifications aux fichiers à la fin, mais aucun commit n'est fait pour maîtriser et aucun besoin de stash.

Cela vous demandera toutefois de git reset --hard HEAD^ dans le référentiel dans lequel vous avez effectué le "[non-commit]", puisque ce commit est de la foutaise.

30
Victor Zamanian

Il est un peu tard, mais cette réponse pourrait aider quelqu'un. Je voulais le savoir parce que je voulais pouvoir utiliser une fonctionnalité/un bogue/quelque chose en cours et travailler à partir du même point sur un autre ordinateur.

Ce qui fonctionne pour moi est de valider mon code en cours (dans une branche sur laquelle je travaille seul). Quand je parviens à mon autre ordinateur, faites un pull puis annulez le commit avec:

git reset --soft HEAD^

Continuez à travailler comme vous étiez, avec tous vos changements en cours là-bas, non engagés et non mis en scène.

J'espère que ça aide.

18
Sir Robert

Il semble y avoir un très bon truc pour résoudre ce problème. vous pouvez utiliser git diff > file.diff (et validez le fichier), puis restaurez les modifications en utilisant git apply file.diff (de n’importe où) pour obtenir le même résultat.

Cela a été expliqué ici ainsi.

15
Daniel Dubovski

J'irais avec une deuxième approche bien que je ne sache pas pourquoi vous ne pouvez pas l'envoyer à une branche maîtresse/en vedette. Il est possible de faire la cueillette des cerises aussi.

9
Eimantas

À la connaissance de tous, l’idée de stash est de cacher quelque chose de peu 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 est bien meilleur.

3
argent_smith

Ce qui suit ne fonctionne pas avec la réserve, mais avec les modifications non validées dans le répertoire de travail. Il crée une branche, soumet automatiquement toutes les modifications en cours et envoie à la télécommande:

commit_and_Push_ ( ) {
    # This will:
    #  1. checkout a new branch stash-XXX
    #  2. commit the current changes in that branch
    #  3. Push the branch to the remote
    local locbr=${1:-autostash-XXX}
    git checkout -b $locbr
    git add .
    git commit -a -m "Automatically created commit"
    git Push Origin $locbr
    echo "Autocommitted changes in branch $locbr ..."
}

Utilisez comme:

commit_and_Push_ my-temp-branch
commit_and_Push_
0
dangonfast