我正在构建一个脚本,它将从svn中检出单个文件,我需要编辑它并将其提交回服务器。
浏览后,我了解svn export
用于克隆单个文件,svn checkout
无法使用。
但是,由于svn export
没有克隆工作副本,我无法提交它。另一方面,svn checkout
不符合我的要求。
问题:有没有办法检查单个文件,该文件有一个工作副本,可以从命令行(窗口)
提交回服务器非常感谢
答案 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 cat
和svnmucc
(自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>