web-dev-qa-db-fra.com

Comment faire en sorte que svn diff produise un fichier auquel appliquer le patch, lorsque svn cp ou svn mv a été utilisé?

Le scénario est le suivant:

  1. svn cp ou mv certains fichiers
  2. modifier ce fichier
  3. svn diff> mypatch

Sur une autre machine (même copie de travail, mais aucune modification):

  1. Essayez d'appliquer mypatch.
  2. Échec -> essaie de modifier un fichier inexistant.

Comment puis-je faire en sorte que svn diff produise un patch applicable au patch, ou appliquer proprement le patch produit par svn diff dans ce cas? Je ne peux pas m'engager. Je voudrais conserver mergeinfo (car la solution de contournement évidente est d'ajouter le fichier comme totalement nouveau, sans connexion au précédent).

64
Paweł Hajdan

Avec Subversion, vous pouvez spécifier le binaire diff à utiliser et les paramètres à lui transmettre. Voir le manuel sur svn diff.

Vous voudriez produire un fichier correctif régulier à partir d'un diff svn, donc vous voudriez que le diff svn ressemble à un diff normal. Essaye ça:

svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
...
patch -p0 < mypatch

Preuve de concept:

echo "newline" >> README.txt
svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
cp README.txt README.txt.patched
svn revert README.txt
patch -p0 < mypatch
diff README.txt README.txt.patched

Aucune différence dans les deux fichiers après le patch.

63
Ray

Si vous souhaitez également vous débarrasser des propriétés svn dans vos correctifs, il existe une option pour cela:

svn diff --patch-compatible > mypatch.diff

svn help diff dit:

  --patch-compatible   : generate diff suitable for generic third-party
                         patch tools; currently the same as
                         --show-copies-as-adds --ignore-properties

Les correctifs créés de cette façon sont censés être compatibles avec le bon ancien utilitaire plain patch.

9
Apteryx

Avez-vous essayé le --show-copies-as-adds option mentionnée sur la page Web svn diff et décrite sur la ( options svn page ?.

5
Adrian Pronk