web-dev-qa-db-fra.com

Générer un patch git pour un commit spécifique

Je dois écrire un script qui crée des correctifs pour une liste de numéros de validation SHA1.

J'ai essayé d'utiliser git format-patch <the SHA1>, mais cela a généré un patch pour chaque commit depuis ce SHA1. Après que quelques centaines de patchs aient été générés, j'ai dû arrêter le processus.

Existe-t-il un moyen de générer un correctif uniquement pour le SHA1 spécifique?

1111
elle

Essayer:

git format-patch -1 <sha>

ou

git format-patch -1 HEAD

Selon le lien de documentation ci-dessus, le drapeau -1 indique à git combien de commits doivent être inclus dans le correctif;

- <n>

Préparez les correctifs à partir des meilleurs commits.


Appliquez le patch avec la commande:

git am < file.patch
1775
manojlds

Pour générer les correctifs à partir des meilleurs commits à partir d'un hachage sha1 spécifique:

git format-patch -<n> <SHA1>

Les 10 derniers correctifs de la tête dans un seul fichier de correctif:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
264
Sriram Murali

Supposons que vous avez l'ID de validation 2 après la validation 1, vous pourrez exécuter:

git diff 2 1 > mypatch.diff

où 2 et 1 sont SHA hachages.

79
brandon

Cette commande (comme suggéré déjà par @ Naftuli Tzvi Kay ):

_git format-patch -1 HEAD
_

Remplacez HEAD par un hachage ou une plage spécifique.

générera le fichier de correctif pour la dernière validation formatée pour ressembler au format de boîte aux lettres UNIX.

_-<n>_ - Préparez les correctifs à partir des premiers commits.

Ensuite, vous pouvez réappliquer le fichier de correctif dans un format de boîte aux lettres en:

_git am -3k 001*.patch
_

Voir: man git-format-patch .

55
kenorb
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

Solution simple et rapide.

25
zdrsoft

Si vous voulez être sûr que le correctif (single commit) sera appliqué par-dessus un commit spécifique, vous pouvez utiliser la nouvelle option git 2.9 (juin 2016) git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

Voir commit bb52995 , commit 3de6651 , commit fa2ab86 , commit ded2c09 (26 avr 2016) par Xiaolong Ye (``) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 72ce3ff , 23 mai 2016)

format-patch: ajoute l'option '--base' pour enregistrer les informations de l'arborescence de base

Les responsables de la maintenance ou les testeurs tiers peuvent vouloir connaître l'arborescence de base exacte à laquelle la série de correctifs s'applique. Enseignez à l'option git de format git une option '--base' pour enregistrer les informations de l'arborescence de base et les ajouter à la fin du premier message (la lettre de couverture ou le premier correctif de la série).

L'information d'arbre de base comprend le "commit de base", qui est un commit bien connu qui fait partie de la partie stable de l'historique du projet sur laquelle tout le monde travaille, et zéro ou plus de "correctifs prérequis", qui sont bien connus. les correctifs en vol qui ne font pas encore partie de la "validation de base" devant être appliqués sur "validation de base" dans l'ordre topologique avant que les correctifs ne puissent être appliqués.

Le "commit de base" est indiqué par "base-commit:" suivi du 40-hex du nom de l'objet de commit.
Un "correctif prérequis" est indiqué par "prerequisite-patch-id:" suivi de "l'ID de correctif" de 40 hexs, qui peut être obtenu en passant le correctif à l'aide de la commande "git patch-id --stable".


Git 2.23 (T3 2019) l’améliorera, car l’option "--base" de "format-patch" a calculé le patch-ids pour les correctifs requis de manière instable, qui a été mise à jour pour permettre le calcul. une manière compatible avec "git patch-id --stable".

Voir commit a8f6855 , commit 6f93d26 (26 avril 2019) par Stephen Boyd (akshayka) .
(Fusionné par Junio ​​C Hamano - gitster - dans commit 8202d12 , 13 juin 2019)

format-patch: rendre --base patch-id stable en sortie

Nous ne vidions pas le contexte à chaque fois que nous traitions un bloc dans le code de génération patch-id dans diff.c, mais nous le faisions lorsque nous générions des identifiants de correctif "stables" avec le 'patch-id' outil.

Portons cette logique similaire de patch-id.c dans diff.c afin que nous puissions obtenir le même hachage lorsque nous générons des identifiants de correctif pour les types 'format-patch --base=' d'invocations de commandes.

9
VonC

Pour générer le chemin à partir d'un commit spécifique (pas le dernier commit):

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
6
Makah

si vous voulez juste diff le fichier spécifié, vous pouvez:

git diff master 766eceb - connexions /> 000-mysql-connector.patch

4
jiahut