"Impossible de déterminer les informations SVN en amont de l'historique de l'arborescence de travail"
Je suis en train d'utiliser la GCC git le miroir, documenté ici.
Il y a quelques temps, j'ai cloné le dépôt git:
git clone git://gcc.gnu.org/git/gcc.git
Ajouté le git-svn trucs:
git svn init -Ttrunk --prefix=origin/svn+ssh://gcc.gnu.org/svn/gcc
Et puis git svn rebase
et git svn dcommit
etc. tous travaillent bien.
Quelques mois plus tard, j'ai effectué divers travaux de développement local branches git, et je viens de commettre plus de changements en amont SVN:
- Mise à jour du git miroir:
$ git rebase
- Assurer que j'ai absolument le plus récent depuis le SVN, mais ça ne fonctionne pas:
$ git svn rebase -v Unable to determine upstream SVN information from working tree history
En quelque sorte, j'ai cassé le méta-données! Ainsi que le ci-dessus, je pense que je ne git svn fetch
à un certain point, par erreur, mais qui ne devrait pas être nocif, devrait-il?
Donc, j'ai essayé de créer une nouvelle branche à partir de la télécommande miroir git:
$ git branch svntrunk remotes/origin/trunk
$ git checkout svntrunk
$ git svn rebase
Unable to determine upstream SVN information from working tree history
Une recherche sur le web suggère que la direction générale de l'histoire a quelque peu divergé à partir de SVN, mais j'ai vérifié git log
et chaque commit un correspondant git-svn-id
ce qui semble infirmer que, non?
Donc, j'ai essayé une nouvelle clone git://gcc.gnu.org/git/gcc.git, et dans ce référentiel git svn rebase
fonctionne très bien. Comment les deux repos, dans laquelle les deux ont eu git rebase
à partir de la même source, sont différentes de l'histoire? Sans doute qu'ils ne le peuvent pas, et la différence est dans les locaux de méta-données?
Maintenant, je ne veux pas à la corbeille le repo sur lesquelles j'ai travaillé (bien que je pouvais), et de l'exportation des correctifs à un autre repo à commettre des défaites de la point d'avoir git-svn en premier lieu. Alors, comment puis-je le réparer?
source d'informationauteur ams
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de le faire avec un greffon. Le greffage est conçu pour être utilisé pour mettre en héritage dépôts est de ma compréhension. Il vous permet de manuellement indiquer à git que certains ref a un parent commun.
Comme mentionné dans les commentaires, il y a peut être une solution plus simple. Cela ne peut fonctionner que si tout le reste a échoué.
Vous auriez tirer vers le bas le courant repo git (avec git ou git-svn) et ajouter votre ancien git-svn repo distant. Ils ne seront pas liés, de sorte gitk ressemblera à ceci:
J'ai eu un accident au travail, où nous avons eu un peu de faire une copie du système de fichiers au lieu d'un svn copie, de sorte que certains de mes noms de branche allusion à cela. Heureusement, cela a du sens de toute façon. Vraiment de la chance que je viens tout juste d'avoir toutes ces images et histoire. Quelles sont les chances!? Probablement assez bon, git-svn est facile de confondre.
La copied_from branche où ils proviennent. Le graft_ref où il a rencontré. Ils avaient ajouté un tas de fichiers, les changements de propriétés, puis changé certains des fichiers. C'était un peu le bazar.
L'idée générale est d'obtenir l'index de la source d'origine, mais le contenu du fichier pour correspondre à la modification. Donc, nous partons dans la ref de la branche, puis de réinitialiser mixte pour obtenir l'indice.
Si vous n'avez pas apporter des modifications entre les deux branches lorsqu'il a été rompu, alors vous ne devriez pas avoir à vous soucier de cette étape.
Maintenant nous avons besoin pour faire le greffon. J'ai coupé les hachages ici pour des raisons de lisibilité.
Qui se penche sur la façon dont vous vous attendez. Maintenant nous avons juste besoin de rebase les modifications en haut de l'arborescence. Mes notes sont manquants, mais je pense que c'est ce que j'aurais fait, hehe.
Vous devriez être en mesure de pousser ces changements où jamais. Les greffes ne sont pas suivis par git, donc la branche greffée (svn_branch/master et amis) rompre à nouveau. Il s'agit effectivement d'un arbre mort, à moins que vous ne la greffe de nouveau. Pour git-svn ce n'est pas vraiment un problème parce que vous venez de valider les modifications, puis tirez sur la source en bas de nouveau comme une copie propre.
C'est un scénario assez commun. J'ai, moi aussi, de cette lorsque vous tentez de synchroniser mes nouveaux dépôts Git contre mon vieux, SVN adossé à le magasin de données.
Le secret est de garder SVN conforme à la branche master du dépôt Git. Les commandes les plus courantes de le faire sont, comme vous l'avez mentionné,
git svn rebase
(pour détendre vos modifications et de les synchroniser de retour avec SVN) etgit reset --hard
(pour effectuer une restauration à une révision précédente lors de votre index est dans un état incohérent). Il a eu beaucoup de recherche à la racine de cette procédure pour moi. (Faire une copie de sauvegarde avant d'effectuer l'une de ces.)La raison de ce qui semble arriver, c'est Git devient profondément confus quand vous gérer deux ou plus de changement histoires simultanément sur la même branche, qui devrait être
HEAD
par défaut. Si quelque chose change en amont, dans le dépôt SVN et en aval de changement histoires que Git ne peut pas se réconcilier, il perd sa place et génère l'erreur que vous avez énumérées ci-dessus.Ce problème est en outre adressée ici. Comme mentionné dans la réponse sommet, vous aurez envie de les exclure la possibilité que votre version de git doit être mis à jour et essayer les correctifs qu'ils ont recommandé, en tant que bien.
La chose la plus simple qui consiste à exécuter
git svn fetch
. Si vous re-joindre une repo git svn, vous obtiendrez cette erreur, sans raison valable lorsque vousgit svn rebase
. Problème sous-jacent est que git-svn fait des hypothèses sur l'état de votre repo qui n'ont pas toujours tenir si vous n'avez pas à démarrer à partir d'un propre svn clone.De la prochaine option pour la sauvegarde de maître
git branch master-bkp
. Et puis exécutezgit reset --hard <way-back>
. Ensuite, exécutezgit svn rebase
.Uniquement si vous travaillez sur un repo git que vous pouvez en aucune façon de joindre l'arrière de svn dans des conditions normales, vous pouvez essayer de greffage. Le greffage est intelligent et complexe, mais possible. Il est également difficile de faire le bien, facile à visser, et très de temps. Pas recommandé en tant que première option.