有没有办法让使用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
我总是要谷歌,但我发现这种方式完美(对我而言)是:
创建补丁git diff --no-prefix master..branch > somefile.diff
,主分区和分支部分是可选的,取决于你想要如何获得你的差异.
发送到任何地方并申请patch -p0 < somefile.diff
.
它总是似乎对我来说很好,似乎是我遇到过的最简单的方法.
简短的回答是patch -p1 -i {patch.file}
.
有关详细信息,请参阅此博客:使用git创建Subversion修补程序.
这是一个帮助脚本,用于针对最新的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 upstream.如果您已提前计划,则在其自己的分支上有一个svn upstream的副本,或者您已经标记了最后一个svn版本.如果您没有提前计划,请使用日期或gitk查找最接近svn状态的git SHA1哈希.
现在通过diff -r
遍历两个克隆计算一个真正的补丁.
Subversion <1.6没有补丁支持.看起来Subversion 1.7允许应用补丁,git/hg扩展到统一差异在我们的TODO列表中.