I have a file of patches (all of which apply to a single file) generated with
git log -p file-of-interest.txt >patches.txt
Now I want to apply these patches in another repo, but when I try
git am patches.txt
I get the error message "Patch format detection failed."
(git apply does not work either). Which is the correct way to apply these patches?
Edit: What I want to do is to extract all changes to a single file between two commits into a set of patches, and then apply those changes in another repo. git log -p from..to -- the-file will generate the diff. If it is not possible to apply the patch from git log, is it possible to make format-patch (or another command) generate the patches for only a single file?
You need to break the patches down into individual patches. You could do that manually from your git log -p output, then use git apply to apply them in sequence. git log -p output wasn't really intended for git to process...
But a better option would be to use git format-patch to create the sequence of patch files for you (no manual splitting needed), then use git am to apply them all in one go...
git format-patch -o <output_directory> <from_revision>..<to_revision> -- file-of-interest.txt
Also note that git am expects email-formatted patches (like those produced by git format-patch, which is why you get "Patch format detection failed"). Patches generated with diff or git diff should be applied with git apply, not git am. But the git format-patch / git am workflow is more flexible and generally more robust.
If you format the hash resulting from git log prepending the number of the path with the "-" symbol then all the patchs can be generated at once in different files. Example:
git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
That will cover all the filter that you can apply from git log. They are not allways consecutive commits. For example taking the patchs corresponding to a given user:
git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
The --reverse option is needed to give you the patch in chronological order, because git log give the most recents first.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With