【问题标题】:How to update a SVN file without performing a checkout?如何在不执行结帐的情况下更新 SVN 文件?
【发布时间】:2011-06-13 12:50:25
【问题描述】:

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

编辑:非常感谢您迄今为止的回答。

我知道你可以用 API 和代码做到这一点,不确定是否有任何 SVN 命令这样做......

非常感谢。

【问题讨论】:

  • 您可以使用--depth=files 或--depth=empty 然后svn update file-to-change.xml 进行浅层检出。但是可以使用 webdav 一次性更新文件,或者使用 SVN 客户端 API 编写自己的客户端。
  • 更新到底是什么意思?替换当前文件或合并更改并可能在之后提交?

标签: svn


【解决方案1】:

是你不想结帐的问题,还是因为你害怕如果你做结帐,你将不得不签出很多文件?

您必须在 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 而无需检查整个目录。

【讨论】:

  • 这个我还没有测试过,但是如果真的有效,这里就是完美的解决方案……
  • 针对我的 jboss 部署目录的 SVN 副本进行了测试,该目录包含许多战争文件。这是从没有工作副本的系统提交新战争文件的绝佳方式。
  • 只要使用svnmucc
【解决方案2】:

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

您可以使用svn import 更新文件

类似:

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

问题是你不能导入一个已经存在的文件,所以你必须先删除然后再导入:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      您可以将工作副本存储在您的临时位置,然后您只需将文件复制到那里并提交。无需删除 WC,只需确保只有特殊的 svn 用户可以访问它,并且您可以将 WC 保留在那里以备下次需要执行此操作时使用。

      【讨论】:

        【解决方案5】:

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

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

        这样,除非您在根文件夹中有 XML 文件,否则您将减少文件数量。如果您可以控制存储库,您甚至可以创建一个子文件夹,仅用于存储该文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-23
          • 2023-04-02
          • 2012-02-07
          相关资源
          最近更新 更多