代码之家  ›  专栏  ›  技术社区  ›  mipadi

如何在一组Git补丁中修改文件路径?

git
  •  13
  • mipadi  · 技术社区  · 14 年前

    我正在研究从SVN回购中提取的Git回购,使用 git svn . 许多卫星之前,SVN回购是从原始(上游)项目的一个来源tarball创建的。原始项目具有如下文件结构:

    /
      COPYING
      README
      src/
          ...many source files...
    

    但是,在创建SVN repo时,会删除自述文件等,并使用 src/ 作为根,回购现在看起来就像:

    /
      ...many source files
    

    我最近把这个svn回购转换成了git回购。原始项目也在Git repo中,我想开始跟踪上游更改,这样我就可以很容易地看到进行了哪些自定义更改(如果适用,还可以将补丁提交回原始项目)。我在上游回购中发现了我们的SVN回购是从中创建的,所以现在我想将我们的更改应用于该提交(在分支中)。我可以使用 git format-patch 并将它们应用到克隆的上游repo…除了文件结构不同,所以补丁不再指向正确的文件。有方法应用补丁吗 Git格式修补程序 SRC/ 克隆的repo中的目录?(请注意,Git补丁还提供了必要的信息,如原始作者姓名、电子邮件和日期,我也希望应用这些信息,而不必手工操作,也就是说,通过乱搞 GIT_AUTHOR_EMAIL 等)

    3 回复  |  直到 9 年前
        1
  •  6
  •   Dan Moulding    14 年前

    在我看来你应该能用 git filter-branch 更改先前从SVN repo克隆的路径。然后,在更新了所有文件路径之后,您现在可以使用 git format-patch 创建补丁 适用于新克隆的上游回购。

    尝试:

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

        2
  •  3
  •   hochl Michael Aaron Safyan    9 年前

    我最近也遇到了类似的问题。我的解决方案是用 src 子目录,然后我在源存储库中创建了一组修补程序:

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

    然后这些补丁被应用到 SRC 目标存储库中的目录:

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

    源存储库中的所有修补程序结束于 SRC 在目标存储库中,即所有路径都进行了相应的调整。

    从那里,您可以再次创建补丁,并将它们导入到分支内的上游存储库中。

        3
  •  2
  •   mfontani    14 年前

    我曾经做过一件非常相似的事情,虽然不漂亮,但它是可以控制的。我最后做的是:

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

    在编辑器中,我查看了哪些位是常见的,需要更改才能让“git am”做我想要的。结果是,每个提交的文件有三行:

    • 从…开始 diff --git a/path/to/file b/path/to/file
    • 从…开始 --- a/path/to/file
    • 从…开始 +++ b/path/to/file

    此时,编辑器需要做的是浏览这些行,并进行必要的更改,以便将所有补丁应用到其他Git存储库。

    我在vim中使用了三个快速输入的宏,ymmv。沿着这条线的东西:

    • 转到下一行,从开始 diff --git a/
    • 前进到后面的斜线 a
    • 根据需要更改路径
    • 前进到斜线后 b/ (从 文件,然后 / )
    • 以与A相同的方式更改路径
    • 下一行 --- )
    • 前进到 a/
    • 改变路径
    • 下一行 +++ )
    • 前进到 B/
    • 改变路径

    重复,直到文件完成。在Vim中,这是一个将它放入宏中的问题( qq<long string of commands>q )尝试过一次( @q )然后做整个文件( 999@q )

    保存文件,进入另一个git repo,并尝试 git am 它。