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?

user2485710
la source
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.

jimmij
la source
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