【问题标题】:Always Commit the same file with SVN始终使用 SVN 提交相同的文件
【发布时间】:2008-08-08 13:55:04
【问题描述】:

在我的网络应用程序中,我有一个通过 $Rev$ 保存当前修订号的文件。这工作正常,除非我不对该文件进行任何更改,它不会被提交。

我是否可以强制单个文件始终提交到 SVN 服务器?

我正在使用适用于 Windows 的 TortoiseSVN,因此任何代码或分步说明都会有所帮助。

【问题讨论】:

    标签: svn


    【解决方案1】:

    基本上,您希望将svnversion 命令的输出保存在一个文件中。

    此类文件通常被保存在存储库之外,并由构建脚本自动创建。我建议你这样做。如果您不构建,而只是在服务器端构建 svn up,则只需在 svn up 之后调用 svnversion 或创建一个 shell 脚本来执行这两个操作。

    另一方面,如果您必须将其保存在存储库中,那么在预提交挂钩中调用 svnversion 将是您的最佳选择。

    【讨论】:

    • +1 支持这个想法。我想补充一点,尽管在大型存储库中,svnversion 可能需要很长时间才能运行(超过一分钟)。因此,我改为解析 'svn info' 输出。
    【解决方案2】:

    如果您安装了 TortoiseSVN,您还可以使用 SubWCRev 工具。使用该工具获取修订,而不是滥用 $REV$ 关键字。

    1. 创建一个包含您的定义的模板文件,可能类似于

      const long WC_REV = $WCREV$;

      在名为 version.h.tmpl 的文件中

    2. 在每次构建时,调用 SubWCRev 以创建您可以在应用程序中使用的“真实”文件:

      SubWCRev 路径\to\workingcopy 路径\to\version.h.tmpl 路径\to\version.h

    这将从 version.h.tmpl 创建文件 version.h,将文本 $WCREV$ 替换为您的工作副本当前所在的修订版。

    docs for SubWCRev 也可能有帮助。

    【讨论】:

      【解决方案3】:

      我认为您可能不了解 $Rev$ 标志的工作原理。 Rev 标志的目标不是让这个修订总是提交到 subversion 存储库中。目标是在更新时,Rev 标志将始终是修订版。 您不需要将代码放入包含修订的 subversion 中。 Subversion 非常擅长为您跟踪该信息。

      您可能错过的是,您需要在文件上设置一个属性,以便正确处理 Revision 关键字。

      svn propset svn:keywords "Revision" file.txt
      

      这将确保每当您进行更新时,$Rev: xxx$ 标志将更新为当前版本。您无需担心它是如何提交到存储库的。

      【讨论】:

      • 我认为@Stefan 有不同的意思。当然,$Rev$ 会为您提供该特定文件 的最后一次提交的适当修订号。但我认为 Stefan 想要拥有整个项目的最新版本号并将其用作他的软件的某种版本号。
      【解决方案4】:

      @gatekiller:看来 TortoiseSVN 确实支持Client Side Hooks

      【讨论】:

        【解决方案5】:

        这工作正常,除非我不对该文件进行任何更改,它不会被提交。

        如果文件从不更改,为什么每次都需要它提交?

        [编辑] @Sean = 我理解他想要做什么,但如果文件永远不会通过钩子或其他进程更新,因此永远不会改变,那么 SVN 永远不会接受它。

        【讨论】:

          【解决方案6】:

          我建议改变方法,每次提交一个文件意味着将全局修订号隐式保存在该文件中。那里的用户可能需要另一个关键字,GlobalKey,它的不存在被解释了here我实际上没有使用提到的svnversion,但是它可能会引导你找到一个解决方案。

          【讨论】:

            【解决方案7】:

            将您的网站从 SVN 部署到网络服务器的脚本能否更改修订号文件?

            不确定在 Windows 上,但使用 bash 脚本,我会做类似的事情..

            $ version=$(svnversion)
            $ svn export . /tmp/staging/
            Export complete.
            $ echo "Revision: ${version}" > /tmp/staging/version.txt
            

            那么/tmp/staging/version.txt 将包含“Revision: 1”(或任何最高修订号)。

            您当然可以替换文件中的某些标识符,例如 $Rev$(而不是按照上面的示例创建 version.txt

            【讨论】:

            • Opps,我忘了复制“set version=”行。谢谢!
            【解决方案8】:

            根据您的客户,其中一些提供了一个预提交挂钩,您可以实现一些简单地“接触”文件并将其标记为已更改的东西。如果您使用 Visual Studio 之类的工具,您可以创建一个“接触”文件的后期构建任务,但您必须确保在提交更改之前进行构建。

            【讨论】:

              【解决方案9】:

              @gradonmantank:因为他希望用最新的修订号更新该文件。您是否完整阅读了他的问题?

              预提交挂钩可能会起作用。

              【讨论】:

                【解决方案10】:

                我曾经有一种手动的方式来做到这一点。我将运行一个脚本,该脚本将使用 sed 将注释替换为我的 $Rev$ 文件中的当前时间戳。这样,文件内容会改变,Subversion 会提交它。

                我没有做的是把它带到下一步:使用Subversion's repository hooks 来自动化这个过程。麻烦的是,我不确定您是否可以更改挂钩中的文件内容。文档似乎表明您不能。

                相反,我猜你需要一个小脚本来代替 svn commit 命令,该命令首先更新时间戳,然后运行正常的提交。

                【讨论】:

                  【解决方案11】:

                  你可以使用 svn pre-commit-hooks 来做到这一点。
                  我想到的一般想法是创建一个,在提交之前将新的修订号放入文件中(使用 svnlook 获取它)或者可能更改文件上的虚假属性(它必须更改或 SVN 将忽略它)。

                  我发现this page 有用。

                  【讨论】:

                    【解决方案12】:

                    我认为确保您的 Web 应用程序中存在具有 SVN 修订号的文件的最佳方法是不提交您提交的文件,而是将其提取为构建脚本的一部分。

                    如果你使用 maven,你可以使用 maven-buildnumber-plugin 来做到这一点。

                    【讨论】:

                      【解决方案13】:

                      提交文件对您没有任何好处。该文件未与内部完整版本一起提交,它仅被关键字替换。如果您查看存储库中的文件,您会看到这一点。

                      因此,您需要强制以某种方式更新文件。

                      如果您在 Windows 平台上,您可以使用 SubWCRev 工具,它与 TortoiseSVN 一起分发。文档here

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2014-10-12
                        • 2021-11-14
                        • 1970-01-01
                        • 2019-09-13
                        • 1970-01-01
                        • 2011-09-22
                        • 2021-11-08
                        • 1970-01-01
                        相关资源
                        最近更新 更多