Svn Subversion:防止提交对一个文件的本地修改?

Svn Subversion:防止提交对一个文件的本地修改?,svn,Svn,我有一个Subversion工作副本,其中我对一个文件进行了一些本地修改。这些修改只与我有关,我不想提交它们。(存储库中的版本包含一些适用于其他用户的默认值,但不适用于我,这就是我希望在本地覆盖它们的原因。) 请注意,尽管我不想提交更改,但我确实希望在执行svn update时接收存储库中的任何更新。此外,只有在我的工作副本中,我才不想将更改提交到该文件,其他用户不应受到影响。因此svn:ignore或commit钩子不符合我的目的 目前,我只是做: svn commit file1 file2

我有一个Subversion工作副本,其中我对一个文件进行了一些本地修改。这些修改只与我有关,我不想提交它们。(存储库中的版本包含一些适用于其他用户的默认值,但不适用于我,这就是我希望在本地覆盖它们的原因。)

请注意,尽管我不想提交更改,但我确实希望在执行
svn update
时接收存储库中的任何更新。此外,只有在我的工作副本中,我才不想将更改提交到该文件,其他用户不应受到影响。因此
svn:ignore
或commit钩子不符合我的目的

目前,我只是做:

svn commit file1 file2...
其中,我显式指定了发生更改的文件,不包括我不想提交的特定文件

然而,当我工作时,我有一个习惯,就是简单地写:

svn commit -m "Log of what I just did"
我担心在我不专心的时候,使用上述命令会无意中提交“禁止”文件

简言之,我所寻找的只是一种在工作副本中“标记”文件的方法,它可以防止Subversion提交该文件中的更改(不必自动排除,即使在尝试提交所有文件时出现错误,也可以)。有点像在“冲突”状态下标记文件

这样的事情存在吗


更新:akent,谢谢你指出这一点。

锁肯定不是你想要的,我认为任何内置功能都不能帮你

根据您工作的环境,我将编写一个脚本:

  • 获取文件列表
  • 删除我不想提交的内容
  • 提交文件
  • 大致如下:

    svn status | grep ^M | grep -v exclude.c | awk -F' ' '{print $2}' | xargs svn ci -m "I'm committing something"
    

    或者,如果文件列表确实是静态的,只需修复该列表

    我理解你的问题;此“禁止”文件可能包含仅与本地生成环境相关的配置设置等。我还没有找到直接告诉SVN忽略版本文件中的更改的方法,但这里有一个我过去使用过的解决方法

    假设您的文件被调用,比如说,“build.conf”。将SVN版本文件命名为build.conf.example。然后,在Makefile或build脚本中,您可以自动将build.conf.example复制到真实的build.conf,该文件保持不变。然后您可以忽略build.conf,然后每个开发人员都可以对其进行任何本地更改

    但是“一定有更好的办法”

    编辑:此处的问题几乎相同:

    此问题位于。但是,如果您不控制存储库,那么答案就没有多大帮助

    :: Stops commits that contain the NOCOMMIT keyword.
    setlocal  
    set REPOS=%1  
    set TXN=%2           
    SVNLook diff %REPOS% -t %TXN% | findstr /I /M /L NOCOMMIT > nul
    if %errorlevel% gtr 0 (
        exit 0
    ) else (
        echo Your commit has been blocked because it contains the keyword NOCOMMIT. 1>&2  
        exit 1
    )
    
    也许可以尝试在subversion之上管理您的本地副本。有一个简单的解决方案。然后,您可以使用来跟踪svn存储库中的更改并提交更改。它将需要一些学习和培训。

    创建一个包含该文件的文件,然后不必关注变更列表。文件将在那里等待提交,但是您的常规提交(在默认变更列表上工作)将永远不会接收它

    svn changelist mylocal file1
    

    将创建名为
    mylocal
    的变更列表,并将文件
    file1
    分配给它。

    您可以使用预提交挂钩。
    在钩子中,使用
    svnlook author
    查看您是否是提交更改的人。如果是这样,请使用
    svnlook changed
    查看您是否正在更改一个禁止的文件。

    根据我的经验:不要将该文件置于版本控制之下,并对其使用svn:ignore

    一开始有点难,因为你不能忽略一个在版本控制下已经准备好的文件,你也不能从版本控制中删除一个文件而不将其从硬盘中删除(以及在下一次更新时从每个工作副本中删除…)。但是,当你最终成功地建立了正确的回购协议,它的工作就像魅力。不要忘记添加一个通用模板来代替原始配置文件(这样每个人都知道新的配置变量,等等)

    新回购协议:

    mkdir config
    svn add config
    svn propset svn:ignore '*.conf' config 
    
    对于现有的repo:请确保,要在每个工作副本中备份您的配置,然后从repo中删除(svn del)config,提交(请注意:下次更新时,该文件将在每个工作副本中删除!您必须有一个备份),然后还原该文件并设置ignore属性

    另一种方法是锁。它保证没有人提交文件,但每次提交时都会导致错误。不太好


    第三种方法是变更集,这是SVN1.5客户端中的一个新特性。这很简洁,但它只与一个工作副本相关,而与全局存储库无关。您必须手动设置它们,添加每个新文件-这很难维护。

    说到Tortoisesvn和变更列表,它已经附带了一个名为提交时忽略的变更列表,它可以满足您的需要。

    如果您在Windows上,请使用Tortoisesvn。您可以向中添加与您描述的行为完全相同的文件。

    实际上,预提交脚本可以完成这项工作

    编写一个预提交脚本,该脚本执行“svnlook diff”,并在更改集中设置了名为“nocommit”的属性时拒绝提交


    然后,在工作副本中,您可以在任何不应提交的文件上设置“nocommit”属性。如果任何文件具有“nocommit”属性,则任何后续提交都将失败。如果以后确实需要签入对文件的更改,则只需从工作副本中删除“nocommit”属性即可。

    有一些答案可以解决:

  • 创建一个预提交钩子脚本,在添加特定属性时拒绝提交。然后可以将此属性添加到工作副本中的文件中,以防止提交
  • OrtoiseSVN将排除特殊变更列表“忽略-o”中的文件
    #!/bin/sh
    REPOS="$1"
    TXN="$2"
    SVNLOOK=/usr/local/bin/svnlook
    $SVNLOOK diff -t "$TXN" "$REPOS" | grep -i "NOCOMMIT" > /dev/null && { echo "Your commit has been blocked because it contains the keyword NOCOMMIT." 1>&2; exit 1; }
    
     svn cp ^/trunk ^/branches/your_name -m "Creating a personal branch."    
     cd working_copy_of_trunk/sub_path/
     svn switch ^/branches/your_name/sub_path/your_file your_file
    
    $ svn status
    M file01 
    M ...
    M file100
    M file_not_ready_for_commit
    
    // This will add all working copy files, can be adjusted to add only relevant files
    $ svn changelist mychangelist -R .
    
    // Remove the nascent one(s)
    $ svn changelist mychangelist --remove file_not_ready_for_commit
    
    // Commit only the files in the changelist
    $ svn commit --changelist mychangelist