web-dev-qa-db-fra.com

Supprimer les propriétés svn: mergeinfo inutiles

Lorsque je fusionne des éléments de mon référentiel, Subversion souhaite ajouter/modifier beaucoup de svn:mergeinfo propriétés de fichiers totalement indépendants des éléments que je souhaite fusionner.

Des questions sur ce comportement ont déjà été posées sur Stack Overflow:

D'après ce que j'ai compris des sujets mentionnés ci-dessus, beaucoup de fichiers de mon référentiel ont explicitement svn:mergeinfo propriétés sur eux, alors qu’ils ne le devraient pas. Le conseil est de réduire le montant et de ne placer ces propriétés que sur les fichiers/dossiers pertinents.

Alors maintenant, ma question: comment puis-je facilement supprimer ces propriétés inutiles? J'utilise TortoiseSVN, mais je suis réticent à vérifier/corriger manuellement des centaines de fichiers. Existe-t-il un moyen plus simple de supprimer ces éléments inutiles svn:mergeinfo Propriétés?

P.S. Je ( ne recherche pas le code de l'API C++ SVN.

136
LeonZandman

Voici un autre moyen de supprimer toutes les propriétés svn: mergeinfo du sous-arbre, mais pas au niveau du dossier racine (nécessaire pour que la création de branches fonctionne correctement).

À la racine du projet, faites:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
139
Vincent

Voici un moyen de supprimer toutes les propriétés de la sous-arborescence svn: mergeinfo. Exécutez-le à la racine de votre référentiel:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Tout en une ligne pour un copier/coller facile:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Pour prévisualiser les fichiers que cela affectera avant de l’exécuter, modifiez le dernier "propdel" en "propget" ou supprimez complètement le dernier tube xargs.

15
Kelvin

Comme mentionné dans ce fil :

  • La plupart des informations de fusion vides ("vides") peuvent être provoquées par une copie de travail vers une copie de travail qui copie/déplace lorsque l'élément source n'a pas d'information de fusion explicite. Utiliser propdel peut être la solution, sauf si vous utilisez un SVN 1.6: depuis 1.5.5, ces copies WC-to-WC ne créent plus d'informations merge vides sur la destination.
  • une opération de restructuration svn move (renommer) antérieure peut également propager des informations de fusion, au lieu de les laisser dans le répertoire racine
  • il y a un problème de mémoire potentiel, suivi par cas 339 qui sera résolu dans une prochaine version 1.6.2 et rétroporté dans la version 1.5
12
VonC

Comme je ne suis pas confiant avec aveugle svn:merge-info _ suppression de propriété, j'ai mis en place un outil permettant d'analyser la situation actuelle sur une copie de travail et de supprimer autant que possible les révisions de fusion des propriétés de fusion non-racine. Après des vérifications et contrôles humains supplémentaires, les modifications de la copie de travail peuvent être validées.

La voici: svn-clean-mergeinfo

N'hésitez pas à signaler tout problème concernant son utilisation afin de l'améliorer.

Subversion 1.10 introduit un nouvel outil dédié à cette tâche: svn-mergeinfo-normalizer

6
Yves Martin

Je sais que cela fait longtemps, mais j'ai rencontré un problème similaire. J'utilise TortoiseSVN 1.6.7. Il se trouve que la propriété se trouve à la racine de ma copie de travail. Lorsque j'ai visualisé les propriétés à la racine et cliqué sur Supprimer sur svn: mergeinfo, il m'a demandé si je souhaitais le supprimer de manière récursive. Cela s'est débarrassé de tous mes cockups svn: mergeinfo.

4
HackedByChinese

Plutôt que de supprimer aveuglément les propriétés de mergeinfo, il est également possible de terminer les fusions "manquantes".

Copiez la propriété mergeinfo à partir du dossier racine, puis effectuez une fusion sur le dossier enfant pour obtenir le chemin relatif approprié et la même liste de révision. (Vous pouvez, mais n'avez pas besoin de, lister uniquement les différences entre cette liste et celle déjà présente dans le dossier enfant.)

Normalement, cette fusion ne devrait modifier que les propriétés de l'information de fusion, pas les fichiers réels. (Si cela finit par changer des fichiers, alors l'une des fusions précédentes ne doit être qu'une fusion partielle, ce qui peut vous causer des problèmes de toute façon.)

Cela devrait finir par supprimer la propriété mergeinfo pour vous, une fois que vous avez obtenu que les deux correspondent exactement. Vous devrez peut-être aussi faire l'inverse: fusionnez à la racine toutes les révisions de fusion présentes uniquement dans le dossier enfant (encore une fois, vous pouvez simplement coller la liste complète et laisser SVN régler les différences à votre place).

2
Miral

Si vous êtes certain de vouloir supprimer en masse les propriétés mergeinfo, vous pouvez utiliser le script BASH suivant.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

Il obtient une liste des fichiers modifiés, le filtre pour fusionner uniquement les modifications de fusion, supprime tout sauf le chemin de fichier réel, convertit les chemins une par ligne en une liste délimitée par des espaces et les appels y reviennent.

2
Chase Seibert

Pour effectuer des modifications dans une structure de répertoires, il s’agirait (recherche non-DOS uniquement):

find . -path "*/.svn" -Prune -or -exec svn propdel svn:mergeinfo '{}' \;

En exécutant un client 1.6.12 connecté à un serveur 1.5, j'ai un problème similaire; Là is un sous-répertoire du projet qui a besoin de son propre svn: mergeinfo, mais avoir 121 entrées de ce type (y compris 5 répertoires sous ./var avec "svn: ignore *") semble quelque peu inapproprié. Ainsi, il serait bien d’avoir un script (par exemple, Python) capable de supprimer les informations de fusion manifestement superflues et de faire état d’autres différences ...

1
Tobias