Est-ce un bon moyen de créer un patch?


15

Je voudrais créer un patch à partir d'une gccbranche spécifique en le comparant aux versions officielles; donc quand je décompresse l'archive tar de la version stable, je peux appliquer le patch et obtenir l'équivalent de ce qui était dans cette branche spécifique.

C'est la première fois que je dois créer un patch, c'est donc ma toute première fois que je le fais et ma principale préoccupation est d'obtenir les bonnes options et l'analyse car nous parlons d'un logiciel extrêmement important

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

Est-ce suffisant et la meilleure façon de le faire?


Les bonnes pratiques habituelles impliquent ici le contrôle de version ou une variante de ceux-ci. Cela inclut mercurial, git et leurs extensions de file d'attente de correctifs associées. Vous pouvez également envisager une courtepointe. Peut-être pourriez-vous approfondir ce que vous essayez de faire?
Faheem Mitha

@FaheemMitha que voulez-vous dire par "plus de détails"? J'ai une version de gccl'écurie officielle tar.bz2et une autre version instable de celle-ci à partir d'un gitréférentiel, je voudrais créer un patch, bien sûr, je voudrais comparer juste contre la masterbranche, pas le référentiel entier.
user2485710

OK, bien sûr, vous pouvez utiliser quelque chose d'aussi simple que diff. mais l'utilisation du contrôle de version est généralement préférable. D'une part, il est beaucoup plus difficile de perdre la trace de ce que vous faites.
Faheem Mitha

@FaheemMitha Je ne comprends pas ce que vous proposez, mon tar.bz2n'est clairement pas un gitréférentiel, comment pensez-vous que je devrais procéder?
user2485710

1
Effectuez une recherche pour «créer des correctifs à l'aide du contrôle de version». Deux réponses précédentes que j'ai écrites et qui sont liées sont unix.stackexchange.com/a/127810 et unix.stackexchange.com/a/139817
Faheem Mitha

Réponses:


20

Oui, c'est un bon moyen de créer un patch.

En bref:

  1. Pour créer un patch pour un seul fichier, votre commande peut ressembler

    diff -Naru file_original file_updated > file.patch

    • -N: traiter les fichiers absents comme vides
    • -a: traiter tous les fichiers comme du texte
    • -r: comparer récursivement tous les sous-répertoires trouvés
    • -u: sortie NUM (par défaut 3) lignes de contexte unifié
  2. Pour créer un patch pour tout le répertoire:

    diff -crB dir_original dir_updated > dfile.patch

    • -c: sortie NUM (par défaut 3) lignes du contexte copié
    • -r: comparer récursivement tous les sous-répertoires
    • -B: ignorer les modifications dont les lignes sont toutes vides

Après tout, pour appliquer ce patch, on peut exécuter

patch -p1 --dry-run < dfile.patch

où switch pdemande au patch de supprimer le préfixe du chemin afin que les fichiers soient correctement identifiés. Dans la plupart des cas, cela devrait l'être 1.

Supprimez --dry-runsi vous êtes satisfait du résultat imprimé à l'écran.


question: que se passe-t-il si un répertoire ou un fichier est supprimé par dir_updatedrapport à ce qu'il était dir_original? Le diffprend soin de cela aussi ou il est ignoré?
user2485710

@ user2485710 diff voit quels fichiers ont été supprimés. file.patchdans juste un fichier texte, vous pouvez donc l'ouvrir dans n'importe quel éditeur ou simplement catet vous verrez une ligne commeonly in dir_original: missingfile.txt
jimmij

ok, mais alors patchsupprimera cela missingfile.txtou quoi d'autre?
user2485710

Ça dépend. Si vous souhaitez les supprimer, utilisez diff -N ...comme dans mon premier exemple. patchSupprime normalement les fichiers vides par défaut. Si vous ne le souhaitez pas, utilisez-le uniquement diff -crBcomme dans votre question. Dans certains cas (rares), une -Eoption dans la patchcommande est également nécessaire pour supprimer les fichiers vides, après le manuel du correctif:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij

j'ai exécuté diff -Naru dir/file dir/file.new > diff.patchobtenir can't find file to patch at input line 3avec la patch -p0 --dry-run < diff.patchpremière ligne de correctif lit la --- dir/filedeuxième +++ dir/file.newavec des horodatages, le diff semble être juste, y a-t-il une option comment signaler les noms de fichiers exacts que la commande recherche?
ptica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.