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
的输出,但是可以诉诸暴力:
- 做两个你的回购克隆
- 在一个克隆中检查出你最新的东西
- 在其他克隆检查什么相当于上游的SVN。 如果你有提前计划,你有自己的分支svn上游副本,或者你已经标记了最后的svn版本。 如果你还没有提前计划,使用date或gitkfind最接近svn状态的git SHA1哈希。
- 现在通过在两个克隆上运行
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之间的差异。