【问题标题】:SVN Export Only Changed FilesSVN 仅导出更改的文件
【发布时间】:2010-06-08 14:43:04
【问题描述】:

我目前将文件提交到我的 SVN 服务器(位于我的网络主机上),然后我从那里通过 SSH 进入并将它们导出到我的 htdocs 中的工作目录。

随着我的应用程序变得越来越大,完全导出是浪费时间。如何仅导出已更改的文件?

svn export -r xxxx:HEAD http://svn/

我找到了一个解决方案,所以也许这会有所帮助?如何自动获取修订版?

【问题讨论】:

标签: svn bash


【解决方案1】:

我一直在使用以下 Bash 脚本:

for i in $(svn diff --summarize -r 1:2 http://repo_path | awk '{ print $2 }'); do p=$(echo $i | sed -e 's{http://repo_path/{{'); mkdir -p $(dirname $p); svn export $i $p; done 

类似于 hudolejev 的解决方案,在这种情况下,它会输出修订版(1 和 2)之间的更改,并循环遍历文件和文件夹。

【讨论】:

  • 与 hudolejev 相同的问题:有没有机会混合您的解决方案,所以它只会通过 FTP 将更改文件导出到远程服务器,而不是本地路径?需要将最新版本的存储库从开发服务器获取到在客户机器上运行的 FTP 服务器。在此先感谢...
  • 太好了,现在我只需要将它编辑为适用于我所在的仓库的通用脚本,并将修订号作为参数,我很高兴!
【解决方案2】:

这适用于使用 Tortoise SVN。我不确定没有它是否可以完成。

我有一个类似的问题,我对数千个文件进行了更改(不要问......这是一个继承的问题!)出千个,所以我不想上传整个目录或依赖winscp 以正确匹配日期(因为此服务器在美国,而我在 AUS)。

所以我签入到 SVN,然后通过 Tortoise SVN 中的“显示日志”。然后我右键单击最近的修订版(尽管它可以是您使用的任何版本)并选择“与以前的修订版比较”。然后我选择了所有出现的文件(CTRL-A)并右键单击“将选择导出到”,然后 BAM 正确文件夹结构中的所有更新文件都已保存并准备上传。

【讨论】:

    【解决方案3】:

    据我所知,不存在纯 SVN 解决方案,但您可以尝试以下方法:

    svn update | egrep "^(A|U)[ ]+(.*)" | cut -b 2 | xargs -i cp -R "{}" /path/to/public_html
    

    在您的工作目录中,您将获得更新并解析输出 -- svn update

    所有标有AU 的文件都可以复制——egrep "^(A|U)[ ]+(.*)"

    去掉AU得到文件名——cut -b 2

    复制自上次更新后更改的文件 -- xargs -i cp -R "{}" /path/to/public_html

    (抱歉笨拙的shell-fu,还在学习中)。

    编辑:使用cut 而不是tr(已修复)

    【讨论】:

    • +1 表示漂亮的命令行。我会从中创建一个小的 bash 脚本。这又可以通过使用“putty”“远程命令”功能远程调用,因此您可以通过单击桌面上的图标进行更新。
    • @hudolejev:有没有机会混合你的解决方案,所以它只会通过 FTP 将更改文件导出到远程服务器,而不是本地路径?需要将最新版本的存储库从开发服务器获取到在客户机器上运行的 FTP 服务器。在此先感谢...
    • 对于上传,我会将最后一部分更改为:xargs -i wput "{}" ftp://server.url/,甚至使用 SCP:xargs -i scp -r "{}" server.url:/path/to/whatever。没有测试,只是猜测。
    【解决方案4】:

    我会在本地存储库中执行 SVN 签出,然后将更改的文件同步到 Web 根目录。或者只是签出到 webroot 并拒绝访问所有 .svn 目录。

    【讨论】:

    • 为什么你如此确定,没有其他可能性存在?事实上,这里有很多,甚至在答案中给出了。 Bash 脚本、Perl 脚本、使用 svn2web 等工具。是什么让您如此确定,您已经提出了所有可能的选项?
    • +1 好吧,还有其他可能。我改变了答案。
    • 太好了! :] 祝你今天过得愉快! :]
    【解决方案5】:

    我不确定这是否与您所指的问题相同,但是在为我正在处理的 Web 应用程序提交文件时,我使用了 svn2ftp.py SVN 挂钩来自动 FTP 修改文件到登台服务器。它很容易安装,我从来没有遇到过问题。

    【讨论】:

      【解决方案6】:

      我想这与我遇到的问题相似。通常我只需要将那些最近更改的文件通过 ftp 传输到我的 Web 服务器。网络服务器上没有 Rsync,所以我无法使用它。
      我在工作中使用了另一种解决方案。我将 SVN 与已安装在本地服务器上的 Trac 结合使用。在其他 Trac 中,可以显示两个修订版之间的更改或在某些更改集中引入的更改。如果您从未使用过 Trac,请访问 Trac 项目的主页以浏览其存储库。它是公开的。
      作为示例,我扩展了最新的稳定版本(在撰写本文时),即 0.12。我能看到的最新版本是 10792。你可以点击版本号来显示这个分支的版本日志。 现在你可以做两件事:

      • Diff 列中选择两个修订,然后单击 查看更改 按钮以查看它们之间的差异
      • 或单击Rev. 列中的小齿轮图标以查看与特定修订相关的变更集(请参阅page)。

      在这两种情况下,您都会看到类似的页面,其中包含已修改文件的列表以及新旧文件之间格式良好的更改。 在页面底部,您可以找到以两种格式下载差异的链接:unified diffzip。最后一个正是您所需要的 - 一个仅包含修改文件的 zip 存档。您现在可以解压缩存档并轻松地将修改后的文件通过 ftp 传输到 Web 服务器。在大型项目中,它确实可以节省时间。
      如果您不熟悉 Trac,请参阅项目网页上提供的 Trac 文档,或者如果您愿意,可以获取我发现非常有用的书 Managing Software Development with Trac and Subversion

      【讨论】:

        【解决方案7】:

        svn2ftp 0.3 - bash 脚本。免费使用,从 svn 存储库导出文件到 ftp。 (检查修订)文件:start.sh - 脚本,settings.properties - svn、ftp、项目属性。

        【讨论】:

        • 您提供的网址不再存在。有谁知道,在哪里可以找到这个脚本?我问的是关于 svn2ftp 的问题,因为有类似的工具,如 svn2web,我尝试过但对结果不满意。
        【解决方案8】:

        给任何其他路人的注意事项...如果您希望 @User123342234 的解决方案在使用 Tortoise 时具有相同的好处,但不希望在能够导出它们之前将更改提交到您的共享/远程存储库。通过使用 Tortoise(一个鲜为人知的功能)创建 local svn repository 可以实现相同的结果。然后,您可以导出远程分支并将其导入本地存储库。然后将远程存储库的本地修​​改工作副本导出到本地存储库的工作副本并提交。您现在可以在本地存储库上使用“显示日志”来导出提交的更改,而无需先提交到共享/远程存储库。不一定是微不足道的,但至少有一次对我有很大帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 2010-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多