La création d'un fichier de correctif à partir d'un diff de 2 dossiers
J'ai apporté quelques modifications à un projet open source sans prendre le temps de créer nos propres fichiers de patch.
Maintenant, le responsable du projet a publié une nouvelle version, et parmi les nouveaux et les fichiers édités, il y a un tas de noms de fichiers.
Whats est la meilleure manière d'appliquer les modifications que j'ai apportées à la nouvelle version ?
Je suis complètement nouveau pour diff/l'utilisation de patchs, et Si je peux le faire avec git, il serait mieux.
- avez-vous utilisé
git clone
pour créer un dépôt local? - Malheureusement, la source d'origine n'est pas sous git, il est publié dans un package avec chaque nouvelle version. Mais je suis en utilisant git pour ma version.
Vous devez vous connecter pour publier un commentaire.
Si vous avez deux répertoires
a
etb
qui sont semblables, et que vous voulezb
être le même quea
, vous pouvez créer et appliquer un patch avec:Supposons que vous avez répertoires
local
(contenant votre version locale de upstream1.0),upstream1.0
, etupstream1.1
. Pour créer et appliquer vos modifications àupstream1.1
:Consultez la documentation pour le patch, et d'essayer de convaincre les responsables amont à l'utilisation de git. Les choses vont être beaucoup plus simple si vous pouvez utiliser git d'outils pour travailler avec votre référentiel local.
diff -urN b a > ba.diff
si vous avez créé de nouveaux fichiers dans un qui ne sont pas dans bdiff -uarN b a > ba.diff
est mieux si il existe des fichiers binaires quelque part.-uraN
parce que le raccourci est plus facile à mémoriser 🙂Si le projet est sous git et vous n'avez pas commis de vos modifications en local, vous pouvez simplement faire
git diff > file.patch
pour obtenir patchable diff de données. Si vous avez validé les modifications en local, vous pouvez le fairegit log
pour trouver la validation avant vous et quegit diff commit_string > file.patch
.Si le projet n'est pas sous git, ou si vous d/l source sans cloner le repository (comme le suggère le titre), vous pouvez utiliser
diff -urN original_dir new_dir > file.patch
pour créer le fichier de patch. Dans les deux cas vous pouvez essayer d'utiliser le patch plus tard pour appliquer le patch.Cependant, envisager l'utilisation de git outils pour fusionner vos modifications avec la nouvelle version, depuis git est en mesure de suivre le nom de fichier trop de changements. Vous aurez besoin d'apprendre beaucoup de choses sur git lui-même, et il vous faudra un certain temps pour bien faire, vous devriez probablement de sauvegarde de votre travail avant de commencer à jouer avec elle.
Git a en charge la détection de renommer les fichiers, donc si vous avez de la chance il va vous aider avec ça. Ce qui suit est une évaluation approximative de l'ébauche de ce que vous devriez faire.
Importation de la version originale:
Maintenant, vous pouvez appliquer vos changements initiaux dans une branche séparée:
Puis la mise à jour vers la version la plus récente:
Jusqu'à présent, tout est archivé dans le dépôt git, il est maintenant temps de commencer à essayer de fusionner vos modifications:
Bonne chance...
Si vous voulez fusionner les fichiers manuellement je recommande vraiment à l'aide de KDiff3. En supposant que le fichier fichier1.c est à partir de open-source-projet-0.1, fichier2.c de open-source-projet-0,2 et fichier3.c à partir de vos modifications, exécutez
Vous pouvez essayer quelque chose qui m'a été suggéré ici avant, un intéressant "différentiation" solution: premier clone de la version la plus récente du projet. Il ne devrait pas avoir tous les changements locaux. Assurez-vous que l' .git dossier est là. Ensuite copier votre arbre de travail, c'est l'ensemble de vos fichiers à l'EXCEPTION de l' .git dossier, à la cloné des pensions. Maintenant, si vous tapez "git st" vous verrez tout ce qui a été changé. Vous aurez besoin de faire le tri aussi l'espacement et les fins de ligne (git config de base.autocrlf ...) si git st rapports des fichiers qui n'ont pas vraiment de changements.
Maintenant pour chaque fichier git st liste, si vous tapez la commande git diff, vous verrez vos modifications.
Alors je voudrais modifier les fichiers un par un, jusqu'à ce que git st ressemble à ce que je veux commettre.
Je ne voudrais pas compter sur de faire des patches parce qu'ils sont extrêmement pointilleux. Vous aurez plus de chances d'obtenir un "ne peut pas appliquer le patch", alors que la solution ci-dessus vous donne une liste de unstaged des modifications qui vous permet de travailler dans n'importe quel ordre que vous voulez.
Vous devriez probablement être à la recherche à
git rebase
. Peut-être même une simplegit pull
faire ce que vous souhaitez.