99

有什么方法可以让使用 git format-patch 创建的补丁与 svn 兼容,以便我可以将其提交到 svn repo?

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

更新:虽然目前不存在执行此操作的脚本或本机 git 方法,但我确实设法从今年早些时候找到了一篇关于如何手动完成此操作的帖子。我已按照说明操作并成功让我的 git 补丁与 svn 一起使用。

如果有人可以尝试编写脚本来完成此任务并为 git 项目做出贡献,我将不胜感激。

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

4

8 回答 8

97

我总是要谷歌这个,但我发现(对我来说)完美的方式是:

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

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

于 2012-11-14T11:01:21.933 回答
21

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

有关详细信息,请参阅此博客:使用 git 创建 Subversion 补丁

于 2012-03-24T13:38:51.060 回答
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.*/===================================================================/"
于 2010-11-29T21:16:15.120 回答
10

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

  1. 制作你的仓库的两个克隆
  2. 在一个克隆中检查您的最新资料
  3. 在另一个克隆结帐中,任何等同于 svn 上游。如果您提前计划好,您在自己的分支上有一份 svn 上游副本,或者您已经标记了最后一个 svn 版本。如果您没有提前计划,请使用 date 或 gitk 查找最接近 svn 状态的 git SHA1 哈希。
  4. diff -r现在通过运行两个克隆来计算一个真正的补丁。
于 2009-04-02T04:20:59.667 回答
10

Subversion < 1.6 没有补丁支持。看起来 Subversion 1.7 将允许应用补丁,并且统一差异的 git/hg 扩展在我们的 TODO 列表中。

于 2009-12-22T14:20:55.267 回答
4

这确实是2008 年初的功能请求

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 中引入(虽然我没有测试过)

于 2009-04-02T04:20:10.403 回答
0

确保您的更改已提交并重新基于本地 git 分支,从 git bash 运行:

git show --pretty >> myChangesFile.patch

于 2013-04-23T21:31:16.133 回答
0

Nicholas 提供的接受的答案工作正常,除非 a)二进制文件存在于差异中或 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

...将使用分支 master 和分支 Feature123 的合并基础之间的差异创建补丁文件 Feature123.patch。

于 2017-06-16T03:28:35.027 回答