2010-11-22 54 views
27

J'ai un script qui construit mon application, la télécharge sur une machine distante, y exécute un test de performance et capture des métriques qui m'intéressent. Le script crée un fichier patch pour les modifications locales que je fais dans mon espace de travail et le montre avec les numéros de performance. Cela m'aide à comparer l'effet de diverses options d'accord. Si je veux recréer mon espace de travail à une date ultérieure, je peux utiliser le numéro de révision SVN et le patch.Y compris les nouveaux fichiers dans SVN diff

svn diff ne signale pas de nouveaux fichiers que j'ajoute à l'espace de travail, à moins que j'utilise d'abord explicitement svn add sur eux. Y at-il un moyen de créer un fichier patch qui inclura également les nouveaux fichiers? PS: Une question similaire a été posée here mais n'a pas reçu de réponse satisfaisante, IMO.

+2

Comment est-ce un problème? Préparer un patch avec SVN c'est comme préparer un commit. Vous exécutez 'svn status' et' svn diff' pour voir si toutes les pièces dont vous avez besoin sont là et * reviennent *, * ajoutent *, * rm * et modifient les fichiers jusqu'à ce que vous soyez satisfait de vos changements. –

+0

@Alexandre, je veux un moyen _scriptable_ pour capturer mes changements locaux de telle sorte que je puisse recréer l'état de l'espace de travail plus tard avec l'info "ce delta, appliqué au numéro de révision XYZ" ou quelque chose de similaire. –

+0

Vous pourriez utiliser 'svn diff --show-copies-as-adds' pour faire ce que vous voulez, voir https://stackoverflow.com/a/2185988/131504 –

Répondre

37

Pour que svn diff incluent tous les fichiers non versionnés de votre copie de travail locale, vous devez d'abord ajouter ces fichiers. svn diff génère le même ensemble de modifications que svn commit utiliserait.

Si vous savez avec certitude que tous les fichiers non versionnés doivent être ajoutés, voici ce que vous pouvez faire.

Préparer une liste de fichiers sans version en prenant de la sortie de svn status toutes les lignes qui commencent par un point d'interrogation:

svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt 

Vous pouvez ensuite transmettre cette liste de fichiers à svn add en utilisant xargs:

xargs -r -d '\n' svn add < ../unversioned_files_list.txt 

Et puis produire le patch:

svn diff > ../my_patch.patch 

Si vous ne souhaitez pas conserver les fichiers ajoutés, utilisez la liste des fichiers pour les unadd:

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt 
+0

Merci Alexandre, on dirait que c'est juste travail. Je vais essayer et revenir. –

+1

Alexandre tu es méchant! – Denis

+0

Fantastique !!! Juste ce que j'essayais de faire !! J'adore la pile !!! Merci Alexandre – jtanmay

11

Merci Alexandre. Au début, son approche n'a pas fonctionné dans mon cas. J'étais sûr que tous les nouveaux fichiers ont été créés A dans svn status, cependant, le fichier diff était encore vide. Enfin, je trouve la différence de svn status sorties, les quatrième colonnes dans mon cas sont tous peuplés de +, comme:

$ svn st 
M  . 
A + New.java 

Cela signifie que l'élément est prévu pour addition-with-history [1]. Cela se produit généralement lorsque vous svn move ou svn copy un fichier ou un répertoire [2]. Dans mon cas, le New.java est svn merged d'une autre branche, y compris l'historique de commit précédent dans cette branche. Nous avons supprimé ces informations d'historique.

d'abord, trouver tous les articles addition-with-history:

svn status | grep ^A | sed -r 's/^A[ +]+//' > /tmp/add_list 

Vous pouvez également supprimer les chemins d'accès en /tmp/add_list pour éviter les avertissements à l'étape suivante.

Ensuite, supprimer leur historique des commits informations par svn remove:

xargs -r -d '\n' svn remove --keep-local --force < /tmp/add_list 

Ensuite, revenir à la solution d'Alexandre pour les ajouter à nouveau à la subversion et obtenir le diff.

Références:

[1]http://svnbook.red-bean.com/nightly/en/svn.ref.svn.c.status.html 
[2]http://www.linuxtopia.org/online_books/programming_tool_guides/version_control_with_subversion/svn.ref.svn.c.status.html