Git-svn peut-il remplir correctement les propriétés svn:mergeinfo?
J'évalue git-svn et j'essaie de déterminer à quel point il va jouer avec un référentiel svn particulier. Je suis principalement préoccupé par le fait que git-svn effectue des fusions de telle sorte que la propriété svn: mergeinfo soit correctement définie dans le repo subversion. Est-ce possible?
Voici ce que j'ai fait jusqu'à présent:
# Checkout the SVN repo.
$ git svn clone svn://server/project1 -T trunk -b branches -t tags
# Make sure we are working on trunk.
$ git reset --hard remotes/trunk
# Modify the working copy.
$ vim file.txt
# Commit locally to the git repo.
$ git commit -a
# Push the commits back to the SVN server.
$ git svn dcommit
Committing to svn://server/project1/trunk ...
M file.txt
Committed r178
M file.txt
r178 = b6e4a3a0c28e7b9aa71d8058d96dcfe7c8a2b349 (trunk)
MAINTENANT, Comment pourrais-je fusionner ce commit particulier dans l'une des branches subversion? Encore une fois, il est très important pour moi que git définisse correctement le svn: propriété mergeinfo lors de la validation de la modification.
4 réponses
Même si c'est une vieille question, l'état actuel des choses avec git-svn a changé depuis qu'il a été demandé. Plus précisément, dans git 1.7.5, il existe un support limité pour définir svn: mergeinfo lorsque dcommitting retour à svn.
git svn dcommit
accepte maintenant les -mergeinfo=<mergeinfo>
drapeau. Pour citer la page de manuel 1.7.5+ :
- mergeinfo=
Ajoute les informations de fusion données pendant la dcommit (par exemple --mergeinfo="/branches/foo:1-10"). Tous svn les versions de serveur peuvent stocker ces informations (en tant que propriété), et les clients svn à partir de la version 1.5 peuvent les utiliser. git svn ne l'utilise actuellement pas et ne le définit pas automatiquement.
Il faut être très prudent lors de l'utilisation de ce bien. Même si la page de manuel dit "ajouter", cela signifie vraiment "remplacer". C'est-à-dire que l'attribut svn:mergeinfo
est défini en fonction de ce qui est passé, il n'ajoute pas les révisions spécifiées au svn:mergeinfo
déjà existant. Apprendre de mes erreur...
Modifier:
Il semble qu'ils travaillent encore à améliorer encore cette situation. À partir de git-svn 1.7.7, le texte suivant a été ajouté à la page de manuel de git-svn:
Clé de configuration: svn.pushmergeinfo
Cette option fera en sorte que git-svn tente de remplir automatiquement la propriété svn:mergeinfo dans le référentiel SVN lorsque cela est possible. Actuellement, cela ne peut être fait que lorsque dcommitting Non-fast-forward fusionne où tous les parents mais les premiers ont déjà été poussés dans SVN.
Réponse courte: Non, git-svn ne se soucie pas des propriétés svn:mergeinfo puisque git-svn ne fait pas de fusions vers svn (il fait des commits).
Réponse longue: la plupart des gens utilisent git-svn pour sortir de la fusion de svn endommagée par le cerveau. Le problème avec svn est qu'il ne fait pas de différence entre la copie de fichiers ou de dossiers (souvent causée par le refactoring) et la création d'une branche puisque la création d'une branche ou d'une balise se fait à l'aide de la commande "svn copy". La propriété svn: mergeinfo est un pansement sur ce problème mais il y a encore des cas où les modifications sont ambiguës. Git a un support beaucoup plus robuste pour la ramification et la fusion.
Semble qu'ils travaillent dessus. Cela pourrait être possible dans la prochaine version:
Http://git.kernel.org/?p=git/git.git;a=commit;h=6abd9332f97441a568421ba233ad8929b50a7efc
Partie Théorique
Le problème est que Subversion et Git ont des mécanismes de suivi de fusion significativement différents.
En conséquence, certaines informations de fusion ne peuvent pas être correctement traduites de Subversion à Git. Par exemple, Git ne suit pas du tout les sélections de cerises, lorsque SVN les suit même au niveau des sous-répertoires.
D'autre part, il n'y a pas de problèmes représentant l'historique de fusion Git dans Subversion. Mais attention ici, car certaines propriétés SVN file / directory sont non présent dans le référentiel git (par exemple svn:keywords), les modifications de ces propriétés sont perdues dans le référentiel SVN une fois que vous avez commit un commit de fusion.
Partie Pratique
Git-svn ne définit pas automatiquement la propriété svn: mergeinfo selon tous les parents de git commit. Mais vous pouvez spécifier la valeur de la propriété manuellement avant dcommitting commit correspondant.
Jetez un oeil à SubGit , un remplacement côté serveur pour git-svn. Il traduit les informations de fusion dans dans les deux sens quand c'est possible. Il prend également en charge des propriétés SVN telles que svn:ignore, svn:EOL-style et svn:mime-type.
Pour plus de détails, veuillez vous référer à la documentation de SubGit et à la comparaison de SubGit vs. git-svn.
SubGit est un produit commercial avec des options gratuites pour les projets open-source, académiques et petits. Et je suis l'un des développeurs de sous-logiciels.