【问题标题】:Easiest way to collect revision history since last merge in Subversion自上次在 Subversion 中合并以来收集修订历史的最简单方法
【发布时间】:2010-12-17 09:58:47
【问题描述】:

我通常会向我的分支提交多个更改并偶尔合并到主干。我想将所有提交消息保留在最终主干合并的最新修订说明中。我不想记住修订号或任何我只想在提交之前以可编辑的方式收集“自上次合并到主干以来所有提交到分支的消息”的内容。

由于此信息仅在 mergeinfo 中可用,我认为这必须由客户提供。我在 TortoiseSVN、SVN Monitor 或命令行客户端中没有找到这个功能。有没有可能我遗漏了一些明显的东西?

【问题讨论】:

    标签: svn tortoisesvn


    【解决方案1】:

    我希望我正确理解了您的要求。您可以尝试以下步骤: (通过 svn 命令行客户端):

    1. svn log -v --stop-on-copy http://myrepo/mybranch gives 输出一份报告,您可以使用该报告找出代表您最后一次从分支合并到主干的修订号。 (XXXX)

    2. svn log -rXXXX:HEAD http://myrepo/mybranch > commitmessg.txt(假设您现在想将分支的 HEAD 版本合并到主干中) - 这会将您的所有提交消息收集到文本文件中。您可能希望编辑此文件以包含有意义的第一行,例如“合并元素如下” - 或“合并与缺陷修复 &&&& 相关的所有元素”等,然后保存。

    3. 照常执行合并

    4. 在提交合并文件时,运行svn commit -F commitmessg.txt 以便消息包含文本文件的内容。 (虽然我不确定提交消息的字符限制)

    希望这会有所帮助。

    编辑:(通过 TORTOISESVN)

    只是想通过 tortoiseSVN 来做到这一点。 您可以进入 tortoiseSVN-Show Log,选择您想要记录的版本范围(使用底部的显示范围按钮)。在消息窗口中突出显示报告 - 右键单击​​ - 复制到剪贴板,然后粘贴到文本文件中。 (不过我更喜欢命令行输出的格式。) 您可以编辑此文件并将其用于合并后提交。

    【讨论】:

    • 不幸的是 --stop-on-copy 停止在“复制”操作,而不是从分支到主干的最新重新集成。因此它显示了自分支创建以来的历史记录。如果我习惯在每次主干合并后重新创建我的分支,这将起作用。然而事实并非如此。 TortoiseSVN 的行为类似。
    【解决方案2】:

    另一个解决方案,灵感来自@tschaible 的回答:

    $ svn mergeinfo --show-revs=eligible ^/branches/version | tr "\\n" "," | xargs -i svn log -c {} ^/branches/version
    

    基本上,这与@tschaible 使用的想法相同,但要快一些,因为 svn log 命令只运行一次,接受有问题的修订列表。 为了使命令更简单、更短,您可以考虑在 ~/.bash_aliases 文件中添加一个别名,如下所示:

    alias svnlog='tr "\\n" "," | xargs -i svn log -c {}'
    

    现在,您可以像这样缩短命令:

    svn mergeinfo --show-revs=eligible ^/branches/version | svnlog ^/branches/version
    

    【讨论】:

      【解决方案3】:

      我在从主干到分支的合并和提交更改方面遇到了一些类似的问题,并且 SVN 1.7 默认不提供 svnmerge,所以我开发了一个小脚本来为我完成这项任务。

      所以这是我的 bash 脚本来合并和提交文件:

      #!/bin/bash
      
      usage() {
      cat << EOF
      
          usage: $0 options
      
          Script to simplify merging and commiting to prelive 
      
          OPTIONS:
             -h      Show usage
             -r      Specify file to use
             -s      Merge source location 
             -d      Place where You want ot merge 
      
      EOF
      }
      
      SOURCE= 
      DESTANATION= 
      REV= 
      # Provide revision number or list of revisions
      while getopts "hr:s:d:" OPTION; do 
          case $OPTION in 
              h) 
                  usage
                  exit 1
                  ;;  
              r) 
                  REV=$OPTARG
                  ;;
              s)
                  SOURCE=$OPTARG
                  ;;
              d)
                  DESTANATION=$OPTARG
                  ;;
          esac
      done
      
      # Create commit message file 
      echo "Preperign commit info file..."
      FILE=commit-info.txt
      touch $FILE
      echo "Merged revision(s) $REV via costom merge script from" > $FILE
      svn info $SOURCE | grep 'URL' | awk '{print $NF}' >> $FILE
      
      LIST=`echo "$REV" | tr ',' ' '`
      
      # Get commit messages from source location 
      echo "" >> $FILE
      for commit in $LIST
      do
          svn log $SOURCE -r $commit >> $FILE
          echo "" >> $FILE
      done
      echo "Done...."
      
      # Merge changes from source location 
      echo "Starting merge....."
      svn merge -c$REV $SOURCE
      echo "Done merging...."
      
      # Commit changes to destanation 
      echo "Start commiting files to SVN...."
      svn commit -F $FILE
      rm $FILE
      echo "Complete"
      

      【讨论】:

        【解决方案4】:

        这并不完全是您正在寻找的内容,但您始终可以通过使用 xargs 将 mergeinfo 管道传递到 svn log 命令来构建提交消息列表。它看起来或多或少是这样的:

        svn mergeinfo $SOURCE $DESTINATION --show-revs eligible | xargs -i  svn log $SOURCE -r '{}'
        

        【讨论】:

        • 注意:TortoiseSVN 表示 ssg 在 Windows 上。不过,他可以使用 Cygwin 来获取 xargs
        • 是的,我是。 Cygwin 的开销太大了。
        猜你喜欢
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-07
        相关资源
        最近更新 更多