How to apply a Git patch to a file with a different name and path?

后端 未结 6 1026
终归单人心
终归单人心 2020-12-04 09:10

I have two repositories. In one, I make changes to file ./hello.test. I commit the changes and create a patch from that commit with git format-patch -1 HE

相关标签:
6条回答
  • 2020-12-04 09:17

    Building upon the answer by @georgebrock, here's a solution I used:

    First, create the patch files as usual (eg. git format-patch commitA..commitB).

    Then make sure that your target repository is clean (there should be no changed or untracked files) and apply the patches like this:

    cd second-repo
    git am ~/00*.patch
    

    For every patch file you will get an error like "error: XYZ does not exist in index". You can now apply this patch file manually:

    patch --directory blue/red < ~/0001-*.patch
    git add -a
    git am --continue
    

    You have to do these three steps for each patch file.

    This will preserve the original commit message etc. without requiring any special git format-patch command or editing the patch files.

    0 讨论(0)
  • 2020-12-04 09:25

    There is a simple solution that does not involve manual patch editing nor external script.

    In the first repository (this may also export a range of commit, use -1 if you want to select only one commit) :

    git format-patch --relative <committish> --stdout > ~/patch
    

    In the second repository :

    git am --directory blue/red/ ~/patch
    

    Instead of using --relative in git format-patch, another solution is to use -p<n> option in git am to strip n directories from the path of the patches, as mentioned in a answer to a similar question.

    It is also possible to run git format-patch --relative <committish> without the --stdout, and it will generate a set of .patch files. These files can then be fed directly to git am with git am --directory blue/red/ path/to/*.patch.

    0 讨论(0)
  • 2020-12-04 09:27

    Answering my own question with a script that does just this: https://github.com/mprpic/apply-patch-to-file

    Rather than modifying the patch file manually, it prompts the user for the target file, modifies the patch, and applies it to the repo you're currently in.

    0 讨论(0)
  • 2020-12-04 09:36

    You could create the patch using git diff and then apply it using the patch utility, which allows you to specify the file you want to apply the diff to.

    For example:

    cd first-repo
    git diff HEAD^ -- hello.test > ~/patch_file
    
    cd ../second-repo
    patch -p1 blue/red/hi.test ~/patch_file
    
    0 讨论(0)
  • 2020-12-04 09:38

    FYI: I recently had problems trying to download a patch from Github and applying it to a local file (which was an "override" in a new location).

    git am wouldn't apply the patch either because the file was "not in index" or "dirty." But, I found that the simple patch command could apply the patch. It did prompt me for the name of the file to be patched.

    Got the job done, anyway ...

    0 讨论(0)
  • 2020-12-04 09:39

    I understand the two files are exactly the same in your situation, thus the patch is likely to succeed.

    However, in case you want to apply a patch to a similar, but not exactly the same file, or you want to do an interactive patching, you will use three way merge.

    Say you modified File A, let's denote A~1 as the previous version, and you want to apply the diff between A~1 to A to File B.

    Open a three way merge tool, for instance Beyond Compare, the path of left panel is A, middle panel is the common ancestor so the path is A~1, the path of right panel is B. Then, the lower panel shows the result of applying the diff between A~1 to A to File B.

    The following figure illustrates the idea.

    0 讨论(0)
提交回复
热议问题