题
是否有任何方式获得补创建}类型的格式修补被svn兼容,这样我可以提交给一个svn仓库?
我工作的一个svn回购上。并希望提交我变回到主要的回购。我需要建立一个补丁要做到这一点,但是贴不适用,因为git格式修补是不同的然后svn.有一些秘密我没有发现了吗?
更新: 虽然目前不存在或脚本本地git的方式来做到这一点,我有没有设法找到一个员额从今年早些时候关于如何手动完成这一任务。我已经遵循了指令,并已成功得到我的混增补程序的工作与svn.
如果有人可能采取一刀在编写脚本,以完成这一和有助于从初的项目,我是每个人都将不胜感激。
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}
.
请参考这个博客的详细信息: 创造颠复贴}类.
下面是一个脚本制作一个差异对最新的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版本。如果你没有提前计划,使用日期或gitk找到混帐SHA1哈希值最相近的SVN状态。
- 现在,通过在两个克隆运行
diff -r
计算真实补丁。
醇>
的Subversion <1.6不具有贴片的支持。它看起来像颠覆1.7将允许应用补丁和混帐/ HG扩展统一的差异是我们的待办事项清单。
这的确是href="https://web.archive.org/web/20081231045039/kerneltrap.org/mailarchive/git/2008/1/15/570032" rel="nofollow noreferrer">特征的 2008年初
Linus Torvalds的当时表示:
所以,我认为,你需要的东西强说“不要做一个git的差异”,而且也应该禁止在最低限度重命名检测。结果 坦率地说,任何程序,它是如此愚蠢到不接受当前的git补丁(即TortoiseSVN的),那么我们就真他妈的不应该只是禁用它的最微不足道的部分。我们要确保我们不启用的任何的相当重要的扩充:点击 即使ToirtoiseSVN将忽略它们,如果忽略它们意味着它误理解diff时,它不应该在所有允许的。
这可能就是为什么
git-format-patch: add --no-binary to omit binary changes in the patch.
已经在Git1.5.6 2008年5月/ 7月推出(I没有测试它虽然)
请确保您的修改提交和重建基础在本地的Git分支的顶部, 从GIT中的bash运行:
<强> GIT中显示--pretty >> myChangesFile.patch 强>
由尼古拉斯提供的接受的答案工作正常,当差异存在的)二进制文件或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的合并基础之间的差异来创建。