有没有快速锁定我的SVN存储库的方法';皮箱?

有没有快速锁定我的SVN存储库的方法';皮箱?,svn,version-control,Svn,Version Control,有时,我需要确保没有人向某个特定分支或我的主干作出承诺。发布版本和重新整合合并就是一个例子 SVN“锁定”所有文件是不现实的(很长时间以来,项目是巨大的)。我也不相信锁定会阻止某人提交新文件 在我完成我正在做的事情之前,如何快速确保没有人向文件夹提交任何内容 谢谢可以在工作完成时临时更改passwd文件。缺点是,这会影响整个存储库,而不仅仅是一个文件夹。如果要进行版本构建,首先要做的是签出特定的修订 在这段时间内,如果有人提交了其他内容,这其实并不重要,因为这不会影响您的构建。首先,您可以尝试在

有时,我需要确保没有人向某个特定分支或我的主干作出承诺。发布版本和重新整合合并就是一个例子

SVN“锁定”所有文件是不现实的(很长时间以来,项目是巨大的)。我也不相信锁定会阻止某人提交新文件

在我完成我正在做的事情之前,如何快速确保没有人向文件夹提交任何内容


谢谢

可以在工作完成时临时更改passwd文件。缺点是,这会影响整个存储库,而不仅仅是一个文件夹。

如果要进行版本构建,首先要做的是签出特定的修订


在这段时间内,如果有人提交了其他内容,这其实并不重要,因为这不会影响您的构建。

首先,您可以尝试在特定的修订版而不是头部上执行这些操作

如果版本不是一个选项,我接下来建议您标记您想要构建的版本或任何东西,并在该版本上进行操作。这显然不适用于合并,因为它违背了合并的目的


但是,要想找到问题的症结所在,我能想到的防止传入信息的最快方法是停止服务器本身。我不是SVN专家,但我已经管理一个盒子好几年了。

有趣的问题。听起来好像您的开发工作流程需要一些更改,因为您遇到了这个问题。特别是,在这样一个大型项目中,您应该考虑更为受控的工作流,因此开发更改不同时出现,并且在同一分支上,作为正在进行的发布构建。例如,您提到了重新整合合并,您当然可以协调项目,以便重新整合合并不会与发布版本同时发生。开发人员不应该直接向正在进行发布构建的分支提交

可能性:

  • 与开发人员进行有效沟通。
    • 宣布你将要做的事情
    • 开发人员至少应该知道,他们不应该提交到正在进行发布构建的分支
  • 在分支中进行构建。然后在构建完成时标记分支
  • 开发人员在不同的分支上进行开发工作。然后将集成合并到一个集成分支中(可能是
    trunk
    )。
    • 开发人员应该知道,不应该在正在进行发布构建的分支上进行集成

在编译发布版本的项目时,我们遇到了这个问题,其中生成服务器属性(CruiseControl.NET项目标签)用作程序集和安装程序版本的一部分

当您分支(或标记)工作副本时,解决方案很简单,例如用于发布版本

工作流程:

  • 签出主干(或分支)的新工作副本
  • 生成您的版本时,将更新文件,使您的工作副本处于修改状态
  • 如果构建成功,svn将工作副本复制到新分支或标记中 如果您希望提交工作副本而不进行分支,那么正如您所说的,如果有人修改了存储库的路径,这将失败(或者至少是不可靠的)

    解决这个问题的一种方法是使用,向svn添加一个构建服务器用户,并为存储库提供不同的
    authz
    文件

    工作流程:

  • authz
    替换为授予生成服务器用户写入权限和所有其他用户读取权限的文件
  • 按照正常方式执行构建
  • authz
    替换为授予所有用户正常访问权限的文件
  • 请注意,svn授权允许基于路径的控制,因此您可以将此限制为仅限于主干(或任何地方),以减少对用户的影响


    使用类似方法(相同工作流)的另一种方法是替换和检查用户;如果不是生成服务器用户执行提交,则拒绝提交(带有相应的错误消息)。同样,如果需要,这可以是基于路径的(有一点额外的正则表达式工作)。

    根据您对服务器的访问权限,发送一条通知,告知在某个时间之前不要提交

    如果无法执行此操作,请使用
    文件://
    文件+ssh://
    对发布版本进行签出/签入,并在此期间关闭SVN服务器进程。(无论是apache还是SVN服务器)然后在构建完成后立即重新启动它


    另外,一定要重做,这样就不需要尽快锁定回购。(我意识到这只是你继承的一个暂时的东西)

    我的拙见是正确的方法

  • 锁上行李箱
  • 创建一个标记
  • 松开行李箱上的锁
  • 导出标签
  • 构建代码
  • 如果生成成功,则锁定标记的版本(否则将其删除)
  • 我就是这样做的,我有一个用于标记部分的脚本

    #!/bin/bash
    #
    #    Copyleft
    #
    
    #
    # Use with caution
    #
    #
    #
    # This script expects 2 variables in the environment to be set : USERNAME & PASSWORD
    # These are needed to access our Subversion server.
    #
    
    #
    # This script tags the code of each project @ HEAD
    # Later version will be more sofisticated to allow tagging at a specified REVISION (it should already be the case but ... )
    #
    # This script must be saved un iso-8858-1 with UNIX LF
    # ##############################################################################################################################################
    
    # for debugging
    set -x
    set -v
    
    
    # The Current verion of the tagging script is
    
    
    BASEDIR=$(dirname $0)
    export BASE_SVN_URL=https://my-svn-server/svn/repository/
    export ROOT_DIR=../..
    export VERSION="v0000.01"
    export REVISION=HEAD
    export TAG_NAME=TC_05
    
    for PRJ in MODULE_1 MODULE_2 MODULE_3
    do
      svn lock --username ${USERNAME} --password ${PASSWORD}  --no-auth-cache --non-interactive  --trust-server-cert   --force                     \
                                                ${BASE_SVN_URL)${PRJ}/trunk/                                                                       \
                                                -m "Locking the trunk of ${PRJ} before generating a Tagged version : ${VERSION} Tag is : ${TAG_NAME}"
    done
    
    
    for PRJ in MODULE_1 MODULE_2 MODULE_3
    do
      svn copy --username ${USERNAME} --password ${PASSWORD}  --no-auth-cache --non-interactive  --trust-server-cert                               \
                                               ${BASE_SVN_URL)${PRJ}/trunk@${REVISION}                                                             \
                                               ${BASE_SVN_URL)${PRJ}/tags/${VERSION}/${TAG_NAME}                                                   \
                                               -m "$1"
    
      svn lock --username ${USERNAME} --password ${PASSWORD}  --no-auth-cache --non-interactive  --trust-server-cert                               \
                                                ${BASE_SVN_URL)${PRJ}/tags/${VERSION}/${TAG_NAME}                                                  \
                                                -m "Tagged version cannot be modified afterwards"
    
    
      svn unlock --username ${USERNAME} --password ${PASSWORD}  --no-auth-cache --non-interactive  --trust-server-cert   --force                   \
                                                ${BASE_SVN_URL)${PRJ}/trunk/                                                                       \
                                                -m "Locking before generating a Tagged version"
    done
    
    set +x
    set +v
    
    #
    # TODO :
    # 
    # 1. Ensure that the following parameters are set correctly
    #      _ username / password (though not mandatory)
    #      _ Commit message, VERSION & TAG ought to be set before start
    #      _ ... ?
    # 2. Ensure that the directory structure exist
    # 3. Ensure that the required variable are set before starting ... but anyway the script will fail :)
    # 4. Check the return code of the important commands command.
    # 5.
    
    我的代码的构建位于另一个脚本中。 长脚本很酷,但在过程早期失败时,往往会引发问题,使系统处于未知状态。 所提供的脚本尚未经过全面测试,也没有在我们的系统上广泛使用,以保证它们是无错误的

    但是我建议很少使用svn锁定

    在发布前的最后阶段,这是一个确保没有最后一分钟的错误不会危及您的发布的手段。。。但是良好的通信应该允许您使用几乎相同的代码,但指定提交编号

    \T、 我需要再推一下钩子吗

    这可以处理很多事情,但防止人们修改文件是它的主旨。您可以通过控制文件控制提交行为:

    [ FILE The repository is now locked and you are no longer allowed to change files]
    Match = .*
    access = read-only
    users = @ALL
    
    [ File Except for me. I can do whatever I want]
    match = .*
    access = read-write
    users = si
    
    控制文件可以存在于rep内部
    [group cm]
    users = si
    
    [group Release]
    users = bob, alice
    
    [group developers]
    users = robert fred cindy @Release
    
    [file You do not have access to make changes to this repository]
    match = .*
    access = read-only
    users = @all
    
    [file Let all developers work on the trunk]
    file = /trunk/**
    access = read-write
    users = @developers
    
    [file only release group can work on the 4.5 branch]
    file = /branches/4.5/**
    access = read-write
    users = @release
    
    [file You cannot edit a tag. You can only create a tag]
    file = /tags/*/
    access = add-only
    Users = all
    
    [file CM group can do anything]
    file = .*
    access = read-write
    users = @CM