创建包含新目录的 SVN 补丁

Posted

技术标签:

【中文标题】创建包含新目录的 SVN 补丁【英文标题】:Creating an SVN patch including new directories 【发布时间】:2011-11-04 00:50:12 【问题描述】:

首先请原谅长文本,但我尽量详细。

我正在为一个开源项目 (DSpace) 进行开发。我对他们的 SVN 仓库没有提交权限,所以我检查了源代码并一直在使用 git 来管理我的版本控制。

在我的开发过程中,我在我的项目中添加了几个目录和二进制文件。

现在是制作 SVN 补丁文件的时候了,这样我就可以回馈社区了! Netbeans 通过 Team-> Create patch 选项为我执行此操作。到目前为止一切顺利...

但是,当我在另一台机器上再次检查源代码并使用补丁命令时:

# get current dir
DIR="$( cd "$( dirname "$0" )" && pwd )" 

#check out dspace release
svn co http://scm.dspace.org/svn/repo/dspace/tags/dspace-1.7.2/ -q $DIR/dspace-1.7.2/

#apply patch
cd $DIR/dspace-1.7.2
echo "Now running at "&& pwd
patch --dry-run -N -p0 < $DIR/patches/patch.diff
cd $DIR

运行脚本

当我运行这个脚本时,一切都很顺利,直到补丁尝试修改我的新目录之一中的文件。上面写着:

can't find file to patch at input line 9214
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|Index: dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI/jquery-ui.js
|--- dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI/jquery-ui.js         Base (BASE)
|+++ dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI/jquery-ui.js     Locally Modified (Based On LOCAL)
--------------------------
File to patch:

在它停止之前,它能够修补一堆已经在原始dspace版本中的文件,所以我认为它与patch命令的-pXXX参数无关(尽管如此我已经尝试了 -p10) ...我认为这只发生在我尝试修补我创建的目录之一中的文件时。 我的猜测是 patch 命令不会创建新目录,所以找不到正确的路径。

这让我发疯了,请问有人知道如何解决我的问题吗?

提前致谢!

编辑:

我在 patch 命令中添加了 --verbose 选项。结果如下:

--------------------------
Patching file dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/autocompleter/styles.css using Plan A...
Hunk #1 succeeded at 1.
Hmm...  The next patch looks like a unified diff to me...
can't find file to patch at input line 9214
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|Index: dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI/jquery-ui.js
|--- dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI/jquery-ui.js     Base (BASE)
|+++ dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI/jquery-ui.js     Locally Modified (Based On LOCAL)
--------------------------
File to patch: 

在我退出补丁过程后,如果我做

cd dspace-1.7.2/dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI

我明白了:

-bash: cd: dspace-1.7.2/dspace-jspui/dspace-jspui-webapp/src/main/webapp/static/js/jQueryUI: No such file or directory

这是我在开发过程中添加的文件夹之一,证明patch并没有创建这些新文件夹。

【问题讨论】:

你能显示部分或全部patch.diff吗?我不知道 NetBeans 是如何生成补丁的,但是如果你在文件系统中添加一个文件或目录并且不告诉 subversion 应该添加它,它就不会出现在 CLI 客户端生成的补丁中。跨度> 我尝试通过 svn add * -- force 添加我修改后的目录中的所有文件,然后我执行了 svn diff > patch.diff 命令。不幸的是,我无法在此处发布差异文件,因为它是一项学术工作,只能在审查后发布...... :( 我认为您可能需要在结帐时手动创建目录和文件 - 进一步考虑这一点,我认为 subversion 不支持在patch - svn diff 只列出文本差异。 是的,我试试。我将创建一个仅包含我的新目录的“覆盖”目录结构,并将其从 svn checkout 复制到根 dspace 目录。 它确实支持添加二进制文件,只是不为它们生成补丁。 【参考方案1】:

如果生成补丁,其中必须包括添加新文件/目录,对于纯颠覆 CLI,您必须将 --git 选项添加到 svn diff 命令

【讨论】:

以上是关于创建包含新目录的 SVN 补丁的主要内容,如果未能解决你的问题,请参考以下文章

使用 SVN,如何选择性地创建补丁文件?

我应该如何构建我的插件开发以及如何将补丁应用于 svn 中的补丁?

在没有 SVN 客户端的情况下应用 TortoiseSVN 补丁

[转]SVN 乱码问题

linux之打补丁

当使用 svn cp 或 svn mv 时,如何使 svn diff 生成将应用补丁的文件?