如何在不执行结帐的情况下更新SVN文件?

时间:2011-06-13 12:50:25

标签: svn

我正在编写一些脚本,用更新版本的xml文件更新Linux机器的SVN仓库。回购巨大,并且在同一个盒子上没有结帐版本。我们的想法是在没有工作副本的情况下更新xml。这是可能的还是我需要签到临时文件夹,复制/覆盖,签入和删除临时文件夹?

编辑:非常感谢您到目前为止的答案。

我知道您可以使用API​​和代码执行此操作,但不确定是否有任何SVN命令执行此操作...

非常感谢。

5 个答案:

答案 0 :(得分:27)

问题是你不想打算结账,还是因为你害怕如果你结账,你必须结账很多文件?

你必须在Subversion中结帐。如果没有工作副本,您不能简单地提交更改。 (不完全正确,您可以在没有结帐的情况下执行svn deletesvn mkdir。)

但是,您可以使用--depth开关限制检出的文件数量。例如,您可以执行以下操作:

$ svn co --depth=empty http://myserver/myrepos/mydirectory

这将检出目录,但不包含任何文件。然后,您可以只对要修改的文件执行svn update,然后提交这些更改:

$ cd mydirectory            #Enter the empty working copy just checked out
$ svn update fileToChange   #Adds file you want to change to your working dir
$ edit fileToChange.xml
$ svn commit -m "Modified 'fileToChange.xml' with latest version"

这将允许您更改文件 fileToChange.xml ,而无需签出整个目录。

答案 1 :(得分:6)

有一种方法可以“更新”没有工作目录的文件,但这取决于你想要做什么。在很多情况下,我做了一些像这样的自动检查,我发现这个解决方案已经足够好了:

您可以使用svn import更新文件

类似的东西:

svn import -m "updating the xml" local.xml http://server/path/to/repo/server.xml

Catch是您无法导入现有文件,因此您必须发出删除然后导入:

svn delete -m "deleting for update" http://server/path/to/repo/server.xml

您丢失了历史记录,但它是一种非常简单且轻量级的更新文件方式,完全取决于您正在做什么。如果您对删除和丢失历史记录感到不舒服,则必须使用其他答案建议的方法。

答案 2 :(得分:2)

如果没有工作副本,您无法提交更改。原因是svn没有将文件发送到服务器,它发送delta(即差异)。这旨在减少网络流量,但显然,它需要知道以前的版本才能计算差异。

您可以使用稀疏选项签出工作副本,这样您就可以创建一个仅包含该1个文件的WC,无需签出整个存储库。 或者,您可以使用webdav公开repo,然后只需将新文件复制到旧文件上,自动提交选项将计算差异并检查文件。

您可以在临时位置存储工作副本,然后您只需将文件复制并提交即可。没有必要删除WC,只需确保只有一个特殊的svn用户可以访问它,你可以将WC留在那里,以便下次你需要这样做。

答案 3 :(得分:2)

如果您有Subversion 1.8或更高版本的客户端,则可以一次添加或更新一个或多个现有文件,而无需使用svnmucc put命令检出存储库。请参阅http://svnbook.red-bean.com/en/1.8/svn.ref.svnmucc.re.html

答案 4 :(得分:0)

如果不在本地签出文件夹,则无法更新文件。但是有一个快捷方式:为了不检查整个存储库,您只能签出要更新的文件所在的子文件夹。

如果您的代表位于https://your.domain/myrep,则可以查看https://your.domain/myrep/myfolder

这样,除非你在根文件夹中有XML文件,否则你会减少文件的数量。如果您可以控制存储库,甚至可以创建一个子文件夹,其目的只是存储该文件。