Create magento 2 Patch
Question
I am working on a Magento module that requires a quick fix. I assume I can fix it by creating Magento 2 "patch" way.
I have never created a patch file before, can anyone help me to create a patch file for a custom module?
Solution
I use this method for creating patch, hope it helps . Let suppose you will modify this file
vendor/magento/module-customer/Block/CustomerData.php
Create a copy of that file with your changes on it:
vendor/magento/module-customer/Block/CustomerDataModified.php
What you need to do is run this command:
diff -u CustomerData.php CustomerDataModified.php > diff.patch
Move diff.patch in your root under a directory, example Mypatches dir . Delete the file added CustomerDataModified.php since the patch is generated with the changes.
Here comes the tricky part , needs some manual modification now : When you open the diff.patch you will get something like this on the top :
--- CustomerData.php 2018-02-21 01:26:16.000000000 -0500
+++ CustomerDataModified.php 2019-01-03 03:57:47.326011737 -0500
Replace those line with this one:
diff --git a/Block/CustomerData.php b/Block/CustomerData.php
index 3ee2rd..8349152 111644
--- a/Block/CustomerData.php
+++ b/Block/CustomerData.php
The index is needed (the numbers are generated by me random, by default are generated from git but in most cases the vendor is in .gitignore)
Next Step is modification of the composer.json in the root of your magento : Add the extra section (if you dont have one already)
"extra": {
"magento-force": "override",
"patches": {
"magento/module-customer": {
"some description abt issue applying this patch": "Mypatches/diff.patch"
}
}
}
And there you go . Your patch is diff.patch (you can call whatever you like ) .
Run composer install
to apply that
OTHER TIPS
Here is my answer, i hope it will help someone:
First make sure that this package is installed via composer: cweagans/composer-patches
Lets say you want to apply a patch from a third-party module installed via composer for a controller. Please make sure that you have this part in the composer.json file:
"extra": {
"magento-force": true,
"composer-exit-on-patch-failure": true,
"patches": {
"vendorname/module-somerandomname": {
"Description here": "patches/my_patch_name.patch"
}
}
},
Assuming that your vendor folder is in the .gitignore file, you can still do:
git add -f vendor/vendorname/module-somerandomname/Controller/Myfile.php
- Do your changes to the Myfile.php
- Do a
git diff vendor/vendorname/module-somerandomname/Controller/Myfile.php > patches/my_patch_name.patch
git reset HEAD vendor/vendorname/module-somerandomname/Controller/Myfile.php
- Do a
composer install
For creating a patch, most of the people are using Github
At git, it is easy to create a patch for a commit.
If you want to create the patch for a commit 452 then use git format-patch -1 {commitId}
Checkout below blogs:
https://coderwall.com/p/6aw72a/creating-patch-from-github-pull-request https://stackoverflow.com/questions/6658313/generate-a-git-patch-for-a-specific-commit https://gist.github.com/emmanueltissera/19d0a8852f000cde13768dd7420a0906
For magento, you can use below steps describe by magento
If you are using Magento Cloud, you can create your patch following @Ylgen method, then move the patch to the m2-hotfixes/ folder and run:
php vendor/bin/ece-patches apply
php bin/magento cache:clean
Documentation:
https://devdocs.magento.com/cloud/project/project-patch.html#apply-a-patch-in-a-local-environment