Git格式补丁兼容svn?

时间:2009-04-02 03:45:14

标签: svn git format-patch

有没有办法让使用git format-patch创建的补丁与svn兼容,以便我可以将它提交给svn repo?

我正在使用github上的svn repo,并希望将我的更改提交回主回购。我需要创建一个补丁来执行此操作,但是补丁无法应用,因为git格式的补丁与svn不同。我还没有发现一些秘密吗?

更新:虽然目前没有脚本或本机git方法来执行此操作,但我确实设法找到了今年早些时候有关如何手动完成此操作的帖子。我已按照说明操作,并成功获取我的git补丁以使用svn。

如果有人可以尝试编写脚本来实现这一目标并为git项目做出贡献,那么我将非常感激。

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

8 个答案:

答案 0 :(得分:86)

我总是要谷歌,但我发现这种方式完美(对我而言)是:

  • 使用git diff --no-prefix master..branch > somefile.diff创建补丁,主要部分和分支部分是可选的,取决于您希望如何获得差异。
  • 随时随地发送,并使用patch -p0 < somefile.diff申请。

它似乎对我来说似乎很好,似乎是我遇到过的最简单的方法。

答案 1 :(得分:21)

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

有关详细信息,请参阅此博客:Creating Subversion patches with git

答案 2 :(得分:17)

这是一个帮助脚本,用于针对最新的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.*/===================================================================/"

答案 3 :(得分:10)

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

  1. 制作两个回购克隆
  2. 在一个克隆中查看最新的内容
  3. 在另一个克隆检出中,等同于svn upstream。如果您已提前计划,则在其自己的分支上有一个svn upstream的副本,或者您已经标记了最后一个svn版本。如果您没有提前计划,请使用日期或gitk查找最接近svn状态的git SHA1哈希值。
  4. 现在通过在两个克隆上运行diff -r来计算真正的补丁。

答案 4 :(得分:10)

颠覆&lt; 1.6没有补丁支持。看起来Subversion 1.7允许应用补丁,git / hg扩展到统一差异就在我们的TODO列表中。

答案 5 :(得分:4)

确实是2008年初的feature request

Linus Torvalds当时说:

  

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

这可能就是为什么

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

已于2008年5月/ 7月在Git1.5.6中引入(我还没有测试过)

答案 6 :(得分:0)

确保您的更改已在您当地的git分支上提交和重新定位, 来自git bash run:

git show --pretty&gt;&gt; myChangesFile.patch

答案 7 :(得分:0)

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

[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"

如果您输入:

git svnpatch Feature123

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