svn导出并提交回服务器

时间:2014-01-17 15:57:40

标签: svn

我正在构建一个脚本,它将从svn中检出单个文件,我需要编辑它并将其提交回服务器。

浏览后,我了解svn export用于克隆单个文件,svn checkout无法使用。

但是,由于svn export没有克隆工作副本,我无法提交它。另一方面,svn checkout不符合我的要求。

问题:有没有办法检查单个文件,该文件有一个工作副本,可以从命令行(窗口)

提交回服务器

非常感谢

2 个答案:

答案 0 :(得分:2)

如果您不介意两次执行svn命令,可以使用此方法 checkout 单个文件:

$ svn co --depth=empty http://svn.vegicorp.net/svn/proj
$ cd proj
$ svn up foo.txt
A      foo.txt
$ vi foo.txt   # Change foo.txt
$ svn commit -m"Modified foo.txt for the heck of it"
sending    foo.txt
Transmitting file data .
Committed revision 194833

--depth=empty检出你的项目并创建一个工作目录。但是,它不会下载该工作目录中的任何文件。然后,您可以更新所需的文件,这些文件将仅下载这些文件。我在这里下载foo.txt进行编辑。

完成后,您可以提交更改,并且您只修改了一个文件而无需下载整个目录。


一个小问题

你为什么要这样做?我问,因为通常当我看到这样的东西时,我发现构建过程正在做一些错误的 次级opcmally 。例如,一个站点正在获取WSDL文件,从WSDL创建Java源文件,然后检入生成的Java源文件。我必须说服他们,如果他们正确地构建了他们的构建,他们将在构建过程中自动生成Java源文件,并且没有理由提交它们。

我并不是说永远不应该这样做。例如,您可能在此特定上下文中更新版本控制文件,并希望将其保存为版本控制的一部分,因为源代码将使用此文件。这样的过程通常会为我举起一面旗帜。如果我知道原因,我可能会建议一个更好的选择。

答案 1 :(得分:1)

您将没有工作副本,但是对于单个文件使用svn catsvnmucc(自1.5.0起作为附加工具以及1.8.0以来的标准命令,在那之前它被称为mucc under contrib。

svn cat $URL > file
# edit file
svnmucc -m 'my log message' put file $URL

如果您想在提交之前进行差异,则必须保留原始文件的副本,因此可能在修改copy file file.orig之前。此外,这将消除您在获取文件和执行put之间所做的提交所做的任何更改。

然而,有一个稍微复杂的方法来处理这个问题。

rev=`svn info $URL | awk '/^Revision:/ { print $2}'`
svn cat -r $rev $URL > file
#edit file
svnmucc -m 'my log message' -r $rev put file $URL

在这种情况下,您必须跟踪使用cat检索的修订版本,如果该文件自该修订版本更改后,您将收到过时错误,就像结帐时一样​​。

我意识到问的人是在Windows上,上面的例子并不直接适用于那里(因为我使用了unix shell)。这个在没有像awk这样的便捷工具的平台上相当烦人的问题并没有被SVN开发人员忽视,因此Subversion将在命令行客户端中使用一个新命令,这使得1.9(svn youngest)中的这个更容易。 / p>