2017-07-12 1 views
0

Mon scénario a:J'ai fait un git svn dcommit avant un pull - comment puis-je réparer mon repo?

  • Mon git-machine locale repo
  • Une télécommande sur GitHub
  • Un serveur SVN sur le réseau local

Le serveur SVN est encore canonique, mais est maintenu en parité avec le repo GitHub. Les autres utilisateurs utilisent exclusivement SVN, et je suis le seul utilisateur git + SVN (ce qui simplifie les choses).

Lorsque je travaille sur d'autres ordinateurs (par exemple, mon ordinateur portable, à la maison, à l'étranger), j'utilise git et je pousse/tire mes commits avec le repo GitHub. Mes commits ne sont pas mis dans SVN jusqu'à ce que je sois au bureau.

Quand je suis au bureau, je vais faire un git pull pour faire en toute nouvelle commits de GitHub puis faire git svn dcommit, suivi d'un retour à git push -f GitHub de sorte que le nouveau annoté SVN canon engage sur GitHub et devenir correspondance SVN parfaitement.

Cependant, aujourd'hui, j'avais des validations en attente sur mon ordinateur de bureau - mais j'avais aussi des commits non-tirés - et je ne sais pas comment le réparer.

À 9 heures ce matin, avant d'exécuter toute anyhere commandes, mes mises en pension ressemblait à ceci:

o = Normal Git commit, lacking SVN annotation 
* = SVN-annotated Git commit 

GitHub 
*---*---*---*---o---o---o---o---o 
A B C D E F G H I 

Local computer git repo 
*---*---*---*---o---o 
A B C D E F 

SVN 
*---*---*---* 
A B C D 

Explication: J'ai eu deux commits, E et F qui étaient dans mon repo informatique local qui ont déjà été tirés de GitHub, ces commits n'étaient pas encore dcommit 'd à SVN.

J'ai fait une erreur ce matin en ce que j'ai immédiatement couru git svn dcommit sur mon ordinateur local sans d'abord courir git pull. L'exécution git svn dcommit a causé les prises en pension pour entrer dans cet état:

GitHub 
*---*---*---*---o---o---o---o---o 
A B C D E F G H I 

Local computer git repo 
*---*---*---*---*---* 
A B C D E' F' 

SVN 
*---*---*---*---*---* 
A B C D E' F' 

Notez que E et F sont maintenant E' et F' parce qu'ils ont été modifiés par git svn être un SVN annotées commit (il a un autre commettras hachage, même si elle représente le même état de base de code). Mon E original et F restent inchangés dans GitHub.

Mon ordinateur fait un git fetch en arrière-plan de toute façon, donc j'ai maintenant le GitHub engage E par I sur mon ordinateur, et GitKraken me montre que j'ai maintenant des branches côte à côte divergeant engager après D:

Local computer git repo: 

*---*---*---*---*---* (master) 
A B C D E' F' 
      \ 
       \-o---o---o---o---o (remote-master) 
       E F G H I 

Comment puis-je résoudre ce problème? (Comme les commits annotés par Git-SVN sont effectivement immuables).

Je pense que ce que je veux faire est Reparent G après F' et ainsi ignorer E et F, puis exécutez git svn dcommit puis faire un retour à git push -f GitHub.

...problème est, je ne sais pas comment réparer G - Je regarde des commandes comme cherrypick mais cela ne semble pas être ce que je suis après, et GitKraken ne me laisse pas rebase (ce n'est pas un menu option pour n'importe quoi dans la branche remote-master).

Répondre

0

Pouvez-vous utiliser la ligne de commande?

git rebase F I --onto master 

I.e. rebase valide après (n'incluant pas) F jusqu'à (y compris) I sur le maître.

0

Il y a plusieurs façons qui devraient aller.

git cherry-pick master..remote-master 

volonté écrémer tous les commits qui sont remote-master mais pas dans master et comme E et F introduisent les mêmes modifications que E' et F', les commits seront vides et vous pouvez les ignorer.
Vous pouvez bien sûr aussi directement faire

git cherry-pick F..remote-master 

git rebase master remote-master 

devrait également fonctionner. Il essaye d'appliquer tous les commits qui sont dans remote-master mais pas dans master sur master. Les validations qui ne changent rien E' et F' doivent être ignorées automatiquement car leurs modifications sont déjà dans cette branche.
Sinon, vous pouvez bien sûr faire aussi

git rebase --onto master F remote-master 

git pull --rebase 

devrait également fonctionner comme git rebase master remote-master.

Comme vous avez toujours besoin d'une histoire réécrite linéaire pour parler au dépôt SVN proprement, vous devriez peut-être changer la configuration de sorte qu'un pull fait automatiquement un rebase et non un merge. Ensuite, vous pouvez également produire un historique propre à dcommit facilement lorsque vous faites des validations sur plusieurs boîtes en même temps.