2010-07-29 57 views
11

我正在使用git svn从SVN回购协议中提取的Git回购协议。在许多月前,SVN回购是从原始(上游)项目的源代码包创建的。最初的项目有一个文件结构如下所示:如何修改一组Git修补程序中的文件路径?

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

然而,当创建SVN回购协议,自述文件等,被剥离出去,并应用与src/作为根创建的,所以回购现在看起来像:

/ 
    ...many source files 

我最近把这个SVN回购转换成了一个Git回购。原始项目也在Git仓库中,我想开始跟踪上游的更改,以便我可以轻松看到自定义的更改已完成(并将补丁提交回原始项目,如果适用)。我在上游回购中发现我们的SVN回购是从创建的,所以现在我想将我们的更改应用于该提交(在分支中)。我可以使用git format-patch轻松地创建一组修补程序,并将它们应用于克隆的上游回购...除了文件结构不同之外,所以修补程序不再指向正确的文件。有没有办法将git format-patch中的补丁应用于克隆回购中的src/目录? (请注意,Git补丁也具有必要的信息,例如原始作者姓名,电子邮件和日期,我也希望应用这些信息,而不必亲手操作,即通过与GIT_AUTHOR_EMAIL等混合在一起)

+2

类似的问题:http://stackoverflow.com/questions/931882/how-to-apply-a-git-patch-from-one-repository-to-another – koppor 2012-04-23 19:00:56

回答

5

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

尝试:

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

+0

几乎可以工作,但是在src/'被组织成子目录 - 这个解决方案直接在'src /'下直接移动它们。任何方式来移动整个子目录树? – mipadi 2010-08-03 14:52:54

+0

@mipadi:对,你是。我的错误实际上不是*测试*我写的是:O。我在回答中纠正了这个错误。感谢您指出问题:) – 2010-08-03 16:08:35

+0

没有biggie - 如果'src /'不包含任何子目录(我忘了在我的问题中提到这一点),您的原始答案可以正常工作。 – mipadi 2010-08-03 16:24:11

2

我不得不做一些非常相似的事情,不是很漂亮,但它是可以管理的。我落得这样做是:

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

编辑器里面,我看着这些位是共同的,需要改变,使“混帐上午”做我想要的东西。这竟然是三线,每个致力于在每个文件中承诺:

  • 开始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文件下一个空格,然后/
  • 变化以同样的方式将路径作为
  • NEX后牛逼线(---
  • 往前走a/
  • 变化路径
  • 在下一行(+++
  • 往前走b/
  • 变化路径

重复,直到文件完成。在Vim中,它只需要一个宏(qq<long string of commands>q),尝试一次(@q),然后在整个文件([email protected])中执行。

保存该文件,进入其他Git回购,并尝试git am它。

3

我最近有一个类似的问题。我的解决方案是创建一个新的目标资源库和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结尾,即所有路径都进行了相应的调整。

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

+1

这与'git filter-branch --subdirectory-filter '结合使我可以完全将我的提交移动到不同的目录。 – 2017-09-29 09:18:54