有没有办法让使用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
答案 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
的输出,但你可以诉诸暴力:
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的合并基础之间的差异。