How can I modify the file path in a set of Git patches?

前端 未结 3 1477
日久生厌
日久生厌 2020-12-30 05:09

I\'m working on a Git repo that\'s been pulled from an SVN repo using git svn. Many moons ago, the SVN repo was created from a source tarball of the original (u

相关标签:
3条回答
  • 2020-12-30 05:38

    I recently had a similar problem. My solution was to create a new target repository with a src subdirectory, then I created a set of patches in the source repository:

    /data/source-repository$ git format-patch -k --root
    

    then those patches were applied to the src directory in the target repository:

    /data/target-repository$ git am -k --committer-date-is-author-date --directory src ../source-repository/*.patch
    

    All patches from the source repository ended in src in the target repository, i.e. all paths were tweaked accordingly.

    From there you could again create patches and import those into the upstream repository inside of a branch.

    0 讨论(0)
  • Seems to me that you should be able to use git filter-branch to change the paths in the previously-cloned-from-SVN repo. Then, after all the file paths have been updated, you can now just use git format-patch to create patches that will apply to the newly-cloned-from-upstream repo.

    Try:

    git filter-branch --tree-filter 'mkdir src; git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files src'

    0 讨论(0)
  • 2020-12-30 05:40

    I had to do something very similar once, wasn't pretty but it was manageable. What I ended up doing was:

    git format-patch <commitish> --stdout > patches-for-upstream.mbox
    $EDITOR patches-for-upstream.mbox
    

    Inside the editor, I looked at which bits were common and needed changed to make "git am" do what I wanted. That turned out to be three lines, per file committed in each commit:

    • the line starting with diff --git a/path/to/file b/path/to/file
    • the line starting with --- a/path/to/file
    • the line starting with +++ b/path/to/file

    What the editor needs to do at this point is to go through these kind of lines and make the changes that you know are necessary to have all the patches apply to the other Git repository.

    I did that in Vim, using three quickly typed macroes, YMMV. Something along the lines of:

    • go to next line starting with diff --git a/
    • go forward to that slash after the a
    • change the path as you need it to be
    • go forward to the slash after the b/ (forward to next space from the a file, then /)
    • change the path in the same way as a
    • next line (the ---)
    • go forward to a/
    • change the path
    • next line (the +++)
    • go forward to b/
    • change the path

    Repeat until the file's done. In Vim it was a matter of getting it in a macro once (qq<long string of commands>q), trying it out once (@q) and then doing it for the whole file (999@q).

    Save the file, go in the other Git repo, and try to git am it.

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