Créez un fichier correctif ou diff à partir du référentiel git et appliquez-le à un autre référentiel git différent

155

Je travaille sur un projet basé sur WordPress et je souhaite patcher mon projet à chaque nouvelle version de WP. Pour cela, je souhaite générer un patch entre deux commits ou balises.

Par exemple, dans mon repo, /www/WPje fais ceci:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Ou

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Mon projet git basé sur WordPress

La git applyligne de commande ne fonctionne pas, je pense parce que nous sommes dans des référentiels différents.

Puis-je générer un fichier de correctif sans commit, juste un différentiel et l'appliquer à un autre référentiel git?

Merci d'avance.

zatamine
la source

Réponses:

243

Vous pouvez simplement utiliser git diffpour produire un diff unifié adapté pour git apply:

git diff tag1..tag2 > mypatch.patch

Vous pouvez ensuite appliquer le patch résultant avec:

git apply mypatch.patch
Enrico Campidoglio
la source
1
Merci Enrico, j'ai utilisé $git diff -u tag1..tag2 > mypatch.patchet $git apply --stat > mypatch.patchla réponse est 0 files changedune autre suggestion s'il vous plaît? :)
zatamine
Vous devez spécifier le chemin d'accès au fichier de correctif en tant qu'argument de git apply. J'ai mis à jour ma réponse avec un exemple.
Enrico Campidoglio
1
J'ai utilisé git diff -p tag1 tag2 > my.patchce qui fonctionnait bien.
barclay
Comment créer des correctifs au format diff unifié? sourceware.org/glibc/wiki/... dit Only unified diff (-uNr) format is acceptable.mais quand j'essaye, git diff -uNr tag1..tag2 > mypatch.patchje reçois le messageusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Aaron Franke
2
Soyez prudent git diff ...+ git apply ...ne gérez pas correctement les fichiers supprimés / déplacés ... quand git format-patch ...+ git am ...faire.
vrince le
51

Pour produire un patch pour plusieurs commits, vous devez utiliser la format-patchcommande git, par exemple

git format-patch -k --stdout R1..R2

Cela exportera vos commits dans un fichier de correctif au format de boîte aux lettres.

Pour générer un correctif pour le dernier commit, exécutez:

git format-patch -k --stdout HEAD^

Ensuite, dans un autre référentiel, appliquez le patch par la amcommande git, par exemple

git am -3 -k file.patch

Voir: man git-format-patchet git-am.

Kenorb
la source
1
Qu'en est-il d'un patch qui peut être appliqué patch -p1? sourceware.org/glibc/wiki/…
Aaron Franke
Je déplaçais le patch de linux vers winodws, donc j'ai dû utiliser --ignore-whitespace comme mentionné ici stackoverflow.com/questions/13190679/…
Mahesh
2
@AaronFranke, vous pouvez essayer l'option '-p': git format-patch -p HEAD ^ 1
Piroxiljin
Il est à noter que cela présente l'avantage de conserver les messages de validation, l'auteur et les dates de validation des validations d'origine.
M. Justin le
0

En complément, pour produire un correctif pour un seul commit spécifique, utilisez:

git format-patch -1 <sha>

Lorsque le fichier de correctif est généré, assurez-vous que votre autre dépôt sait où il se trouve lorsque vous utilisez git am ${patch-name}

Avant d'ajouter le patch, utilisez git apply --check ${patch-name}pour vous assurer qu'il n'y a pas de conflit.

Eugène
la source