【问题标题】:how do I remove an existing changelist from SVN如何从 SVN 中删除现有的更改列表
【发布时间】:2012-10-15 22:37:01
【问题描述】:

我创建了一个变更列表...

$ svn changelist my_changes

...向其中添加文件,然后提交更改列表...

$ svn ci --changelist my_changes --keep-changelists

...所以现在,我“保留”了我的更改列表,并且每次查看状态时它都会显示。

$ svn status
... modified/added/deleted files listed here...

--- Changelist 'my_changes':
... files that are a part of this changelist listed here...

我“保留”更改列表是有原因的,但我不再需要它,所以我准备删除它。如何从 SVN 中删除此更改列表?我知道如何从更改列表中删除文件,但不知道更改列表本身。

【问题讨论】:

    标签: svn changelist


    【解决方案1】:

    从更改列表中删除所有相关文件,它就会消失。

    官方方式

    https://stackoverflow.com/a/15992735/253468

    svn changelist --remove --recursive --cl my_changes .
    

    手动方式

    svn changelist --remove file.name

    D:\Programming>mkdir test
    D:\Programming>cd test
    D:\Programming\test>svnadmin create .
    D:\Programming\test>svn co file:///D:\Programming\test co
    Checked out revision 0.
    D:\Programming\test>cd co
    D:\Programming\test\co>echo "hello" > test.file
    D:\Programming\test\co>svn add test.file
    A       test.file
    
    D:\Programming\test\co>svn status
    A       test.file
    
    D:\Programming\test\co>svn changelist mycl test.file
    A [mycl] test.file
    
    D:\Programming\test\co>svn status
    --- Changelist 'mycl':
    A       test.file
    
    D:\Programming\test\co>svn changelist --remove test.file
    D [mycl] test.file
    
    D:\Programming\test\co>svn status
    A       test.file
    

    Bash 中的自动化

    # Remove all files from a specific CL
    # Usage: svn_remove_cl my_changes
    function svn_remove_cl() {
        svn status |\
        sed -n "/--- Changelist '$1':/,/--- Changelist.*/p" |\
        grep -v '^--- Changelist' |\
        awk '{print $2}' |\
        xargs svn changelist --remove
    }
    

    解释:

    • svn status:输出所有修改过的文件
    • sed:找到changelist,取CL标题后面的输出,直到下一个CL或者svn status的输出结束
    • grep:从缓冲区中删除 CL 标题
    • awk:删除文件状态,只保留文件名(即第二列)
    • xargs:将每一行作为参数传递给svn changelist
      (如果文件名中有空格或特殊字符,可能需要调整)

    示例运行

    ~/tmp/wc$ svn status
    A       d
    
    --- Changelist 'cl_a':
    A       a
    A       e
    A       f
    
    --- Changelist 'cl_x':
    A       b
    A       c
    ~/tmp/wc$ svn_remove_cl cl_x
    Path 'b' is no longer a member of a changelist.
    Path 'c' is no longer a member of a changelist.
    ~/tmp/wc$ svn status
    A       b
    A       c
    A       d
    
    --- Changelist 'cl_a':
    A       a
    A       e
    A       f
    

    【讨论】:

    • 是的...我知道这种方法,但它是如此手动。必须有一个自动更改列表删除命令...
    • 如果有,svn help changelist 不会列出它……或者using --recursive 切换。另外,将 CL 描述从 svn status 复制到文件然后:cat file | sed 's/[A-Z][:blank:]+\(.*\)/\1/g' | xargs svn changelist --remove,抱歉,无法测试,我手头没有 unix 命令行。
    • 嘿,根据我上一条评论中的想法,添加了一个脚本来帮助删除。我没有在实际的开发中使用它,但是在一个示例 repo 中它起作用了(参见示例)。
    【解决方案2】:

    如果您只想删除一个更改列表(例如 my_changes),请移至工作副本的顶级文件夹并运行:

    svn changelist --remove --recursive --cl my_changes .
    

    【讨论】:

    • svn changelist --remove --changelist my_changes --depth infinity . 也应该做这项工作。
    • 这很好用。谢谢。请记住在末尾包含. 以捕获所有文件。
    【解决方案3】:

    对于那些想知道的人,您可以使用带有 svn 的单个命令来完成此操作。只需导航到更改列表下的文件所在级别目录并运行:

    svn changelist --remove --recursive .
    

    这将遍历当前目录下的所有文件并尝试解除它们与更改列表的关联。

    【讨论】:

    • 完美……正是我想要的。
    • 我确认这很好用(在 1.9.3 中),只要您没有将项目设置为任何外部的更改列表。在这些情况下,您可能还需要指定每个外部路径。
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2017-09-24
    • 2011-08-15
    相关资源
    最近更新 更多