Git格式的补丁是SVN兼容?

有没有办法使用git format-patch创build的补丁是svn兼容的,这样我就可以将它提交给svn repo?

我在github上工作了一个svn回购,并想把我的修改回到主回购。 我需要创build一个补丁来做到这一点,但补丁不能应用,因为git格式的补丁不同于svn。 我还没有发现一些秘密吗?

更新:虽然目前没有脚本或本地git的方式来做到这一点,但我确实设法从今年早些时候find一篇文章,介绍如何手动完成此操作。 我遵循指示,并成功让我的git补丁与svn一起工作。

如果有人可以试图写一个脚本来实现这一点,并为git项目做出贡献,我将会非常感激每个人。

http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308

我总是不得不谷歌,但我发现,完美的作品(对我来说)是:

  • 使用git diff --no-prefix master..branch > somefile.diff创build补丁,master和branch部分是可选的,取决于你想如何得到你的差异。
  • 发送到任何地方,并使用patch -p0 < somefile.diff

它似乎总是为我工作,似乎是我遇到的最简单的方法。

简短的答案是patch -p1 -i {patch.file}

有关详细信息,请参阅此博客: 创buildsubversion-patches-with-git

下面是一个帮助脚本,用于比较最新的svn变更集和给定的提交: http : //www.mail-archive.com/dev@trafficserver.apache.org/msg00864.html

 #!/bin/sh # # git-svn-diff # Generate an SVN-compatible diff against the tip of the tracking branch TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'` REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)` git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* | sed -e "s/^+++ .*/& (working copy)/" -e "s/^--- .*/& (revision $REV)/" \ -e "s/^diff --git [^[:space:]]*/Index:/" \ -e "s/^index.*/===================================================================/" 

SVN可能无法理解git diff -p的输出,但是可以诉诸暴力:

  1. 做两个你的回购克隆
  2. 在一个克隆中检查出你最新的东西
  3. 在其他克隆检查什么相当于上游的SVN。 如果你有提前计划,你有自己的分支svn上游副本,或者你已经标记了最后的svn版本。 如果你还没有提前计划,使用date或gitkfind最接近svn状态的git SHA1哈希。
  4. 现在通过在两个克隆上运行diff -r来计算一个真正的补丁。

Subversion <1.6没有补丁支持。 它看起来像Subversion 1.7将允许应用补丁和git / hg扩展到统一比较是在我们的TODO列表上。

这确实是2008年初的function要求

Linus Torvalds当时说:

所以我会争辩说,你需要一些更强的话来说“不要做一个git diff”,而且也应该至less不允许重命名检测。
坦率地说,任何程序是如此愚蠢,以至于不接受当前的git补丁(即TortoiseSVN),那么我们该死的不应该只是禁用最微不足道的部分。 我们应该确保我们不启用任何相当重要的扩展:
即使ToirtoiseSVN会忽略它们,如果忽略它们意味着它误解了差异,它应该不被允许。

这可能是为什么

  git-format-patch: add --no-binary to omit binary changes in the patch. 

已经在2008年的五月/七月在Git1.5.6中引入了(我还没有testing过)

确保你的修改是在你本地的git分支之上进行的,从git bash run:

git show –pretty >> myChangesFile.patch

Nicholas提供的接受答案工作得很好,除非a)二进制文件存在于diff中,或者b)你在windows git中工作并且有空格的目录。 为了解决这个问题,我不得不添加一个嵌套的git diff命令来忽略二进制文件和sed命令来转义空格。 编写起来有点麻烦,于是我创build了一个别名:

 [alias] svnpatch = "!f() { git diff --name-only --no-prefix master...$1 | grep -Ev \"\\.sdf|\\.Doc|\\.dll|\\.zip|\\.exe\" | sed 's_\\s_\\\\\\\\ _g' | xargs git diff --no-prefix master...$1 > $1.patch; echo "Created $1.patch"; }; f" 

如果你input:

 git svnpatch Feature123 

…将创build一个补丁文件Feature123.patch,其中分支主文件合并基础和分支Feature123之间的差异。

Interesting Posts