Supprimer les propriétés svn: mergeinfo inutiles

136

Lorsque je fusionne des éléments dans mon référentiel, Subversion souhaite ajouter / modifier de nombreuses svn:mergeinfopropriétés à des fichiers qui ne sont absolument pas liés aux éléments que je souhaite fusionner.

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

D'après ce que je comprends des sujets mentionnés ci-dessus, il semble que beaucoup de fichiers de mon référentiel ont des svn:mergeinfopropriétés explicites , alors qu'ils ne le devraient pas. Le conseil est de réduire la quantité et de ne mettre ces propriétés que sur les fichiers / dossiers pertinents.

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

PS Je ne cherche pas de code API C ++ SVN.

LéonZandman
la source

Réponses:

142

Voici une autre façon de supprimer toutes les propriétés de sous-arborescence svn: mergeinfo mais pas dans le dossier racine (cela est nécessaire pour que le branchement fonctionne correctement).

Depuis la racine du projet, faites:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Vincent
la source
57
Ou, ne le faites pas sur le répertoire racine "svn propdel -R svn: mergeinfo ./*"
JeremyWeir
3
"svn propdel -R svn: mergeinfo ./* ./.[^..
Peter
3
la suppression de la sortie l'accélère: "svn propdel svn: mergeinfo -R> nul" (ou> / dev / null sous Linux)
bebbo
2
@JeremyWeir Que voulez-vous dire par "ne le faites pas sur le répertoire racine"? D'où alors? Vous avez beaucoup de votes positifs sur ce commentaire, mais je ne vois pas l'alternative.
TT.
3
@TT. Je pense que l'idée est d'aller simplement dans le répertoire contenant toutes les informations de fusion foirées et de le faire à partir de là, afin que vous n'ayez pas à rétablir le répertoire racine. Vous ne voulez pas gâcher les informations de fusion de la racine.
JeremyWeir
15

Voici un moyen de supprimer toutes les propriétés svn: mergeinfo de la sous-arborescence. 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 seule 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 quels fichiers cela affectera avant de l'exécuter, changez le dernier «propdel» en «propget» ou supprimez complètement le dernier tube xargs.

Kelvin
la source
2
Fonctionne avec les traits d'union dans les fichiers: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | couper "-d" -f1 | xargs svn propdel svn: mergeinfo
Squirrel
12

Comme mentionné dans ce fil :

  • La plupart des informations de fusion vides («vide») peuvent être causées par une copie de travail vers des copies / déplacements de copie de travail où l'élément source n'a pas d'informations de fusion explicites. Utiliser propdel peut être la solution sauf si vous utilisez un SVN 1.6: depuis la 1.5.5, ces copies WC-WC ne créent plus d'informations de fusion vides sur la destination
  • une opération précédente de restructuration svn move (renommer) peut également propager mergeinfo, au lieu de les laisser dans le répertoire racine
  • il y a un problème de mémoire potentiel, suivi par le cas 3393 qui sera corrigé dans une prochaine version 1.6.2 et rétroporté dans 1.5
VonC
la source
6

Comme je ne suis pas sûr de la svn:merge-infosuppression des propriétés aveugles , j'ai implémenté un outil pour analyser la situation actuelle sur une copie de travail et supprimer autant de révisions de fusion que possible des propriétés d'informations de fusion non root. Après des vérifications et des contrôles humains supplémentaires, les modifications sur la copie de travail peuvent être validées.

Le voici: svn-clean-mergeinfo

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

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

Yves Martin
la source
2
Cet outil est idéal pour consolider les propriétés des informations de fusion, comme les types qui sont créés avec des fusions partielles de sous-répertoires que de nombreux développeurs moins que parfaitement coordonnés dans une grande équipe peuvent créer. L'outil semble avoir un problème avec des fichiers qui n'existent pas dans chaque branche, j'obtiens des propriétés d'informations de fusion restantes sur les fichiers indiquant des révisions sur des branches dans lesquelles le fichier n'a jamais existé.
davenpcj
Je conviens que ce n'est pas parfait ... c'est pourquoi des "contrôles et contrôles humains" sont toujours nécessaires. Dans votre cas, si vous avez identifié des révisions non pertinentes dans les propriétés merge-info, vous pouvez supprimer ces révisions ou toute la propriété svn: merge-info sur ces fichiers avant de valider. Veuillez utiliser github pour demander des améliorations.
Yves Martin
4

Je sais que cela fait un moment, 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 consulté les propriétés à la racine et cliqué sur Supprimer sur svn: mergeinfo, il m'a demandé si je voulais le supprimer de manière récursive. Cela m'a débarrassé de tous mes cockups svn: mergeinfo.

moribvndvs
la source
J'étais dans la même situation. A travaillé pour moi. Merci!
andrewd18
2

Si vous êtes sûr de vouloir supprimer en masse les propriétés de 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, la filtre pour que les informations de fusion uniquement changent, supprime tout sauf le chemin du fichier réel, convertit les chemins un par ligne en une liste délimitée par des espaces, et les appels reviennent sur cette liste.

Chase Seibert
la source
2
Merci, mais comme vous l'avez peut-être
compris en
La même chose devrait être possible sous DOS, mais probablement pas aussi laconique.
Chase Seibert
1
Cela ne rétablit-il pas uniquement les fichiers avec des informations de fusion modifiées sur le répertoire de travail actuel? Si tel est le cas, cela ne résout pas le problème: les informations de fusion explicites existantes. Pour cela, vous devez vous propulser.
Dominic Scheirlinck
2
C'est assez bogué - avoir un nom de fichier avec des espaces dans son nom? Avec des caractères glob dans son nom? Mauvaise nouvelle dans les deux cas. La méthode approuvée / prise en charge pour analyser la sortie de svn status utilise l' --xmlindicateur et un analyseur XML; tout le reste peut changer entre les versions, car la compatibilité ascendante sur le format de sortie textuelle n'est pas garantie.
Charles Duffy
2

Plutôt que de simplement 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 le chemin relatif approprié et la même liste de révisions. (Vous pouvez, mais ce n'est pas nécessaire, lister uniquement les différences entre cette liste et celle déjà présente dans le dossier enfant.)

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

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

Miral
la source
1

Pour faire des changements dans une structure de répertoires, ce serait ("find" 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à y a un sous-répertoire dans le projet qui a besoin de son propre svn: mergeinfo, mais avoir 121 entrées de ce type (dont 5 répertoires ci-dessous ./var avec "svn: ignore *") semble quelque peu inapproprié. Ainsi, ce serait bien d'avoir un script (par exemple Python) capable de supprimer les informations de fusion manifestement superflues et de parler d'autres différences ...

Tobias
la source