32 votes

Est-ce que git-svn peut remplir correctement les propriétés svn:mergeinfo ?

Je suis en train d'évaluer git-svn et j'essaie de déterminer comment il va fonctionner avec un dépôt svn particulier. Je suis surtout préoccupé par le fait que git-svn puisse effectuer des fusions de telle sorte que la propriété svn:mergeinfo soit correctement définie dans le dépôt subversion. Cela est-il 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 dois-je faire pour fusionner ce commit particulier dans une des branches de subversion ? Encore une fois, il est très important pour moi que git définisse correctement la propriété svn:mergeinfo lors de la validation du changement.

52voto

Paul Wagland Points 10487

Même si cette question est ancienne, l'état actuel des choses avec git-svn a changé depuis qu'elle a été posée. Plus précisément, dans git 1.7.5, il existe une prise en charge limitée de la définition de svn:mergeinfo lors du retour à svn.

git svn dcommit accepte désormais le -mergeinfo=<mergeinfo> drapeau. Pour citer le 1.7.5+ page de manuel :

-mergeinfo=<mergeinfo>.

Ajoute les informations de fusion données pendant le dcommit (par exemple --mergeinfo="/branches/foo:1-10"). Toutes les versions du serveur svn peuvent stocker cette information (comme une propriété), et les clients svn à partir de la version 1.5 peuvent l'utiliser. git svn ne l'utilise pas actuellement et ne la définit pas automatiquement.

Il faut cependant être très prudent lorsqu'on l'utilise. Même si la page de manuel dit "add", ce qu'elle signifie vraiment est "replace". C'est-à-dire que le svn:mergeinfo est défini en fonction de ce qui est transmis, il n'ajoute pas les révisions spécifiées à l'attribut svn:mergeinfo . Apprenez de mon erreur

Editar:

Il semble qu'ils travaillent toujours à l'améliorer encore plus. A partir de git-svn 1.7.7 le texte suivant a été ajouté à la page de manuel git-svn :

Clé de configuration : svn.pushmergeinfo

Cette option permet à git-svn d'essayer 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 l'on commet des fusions non rapides où tous les parents sauf le premier ont déjà été poussés dans le SVN.

12voto

Mike Hopper Points 529

Réponse courte : Non, git-svn ne se soucie pas des propriétés de 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 s'affranchir de la fusion de svn, qui fait mal au cerveau. Le problème avec svn est qu'il ne fait pas la 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'un tag se fait en utilisant la commande "svn copy". La propriété svn:mergeinfo est un pansement sur ce problème mais il y a toujours des cas où les modifications sont ambiguës. Git a un support beaucoup plus robuste pour la création de branches et la fusion.

6voto

Marius K Points 272

On dirait qu'ils y travaillent. Cela pourrait être possible dans la prochaine version :

http://git.kernel.org/?p=git/git.git;a=commit;h=6abd9332f97441a568421ba233ad8929b50a7efc

1voto

vadishev Points 1840

Partie théorique

Le problème est que Subversion et Git ont des mécanismes de suivi des fusions très 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 cherry-picks, alors que SVN les suit même au niveau des sous-répertoires.

D'un autre côté, il n'y a aucun problème pour représenter l'historique des fusions de Git dans Subversion. Mais attention, comme certaines propriétés des fichiers/répertoires SVN ne sont pas présentes dans le dépôt Git (par exemple svn:keywords), les modifications de ces propriétés sont perdues dans le dépôt SVN une fois que vous faites un commit de fusion.

Partie pratique

git-svn ne définit pas automatiquement la propriété svn:mergeinfo en fonction de tous les parents d'un commit Git. Mais vous pouvez spécifier la valeur de la propriété manuellement avant d'effectuer le commit correspondant.

Jetez un coup d'œil à SubGit un remplacement côté serveur de git-svn. Il traduit les informations de fusion dans les deux sens quand c'est possible. Il supporte également 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 à Documentation SubGit y SubGit vs. git-svn comparaison.

SubGit est un produit commercial avec des options gratuites pour les projets open-source, universitaires et de petite taille. Et je suis l'un des développeurs de SubGit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X