自Subversion上次合并以来收集修订历史的最简单方法

时间:2009-11-17 11:09:56

标签: svn tortoisesvn

我通常会对我的分支进行多次更改,偶尔会合并到主干。我想将所有提交消息保存在最终主干合并的最新修订说明中。我不想记住修订版号或任何我想要的“在上次合并到干线后所有提交消息到分支的所有提交消息”在我提交之前以可编辑的方式收集在一起。

由于此信息仅在mergeinfo中可用,我认为这必须由客户提供。我没有在TortoiseSVN,SVN Monitor或命令行客户端中找到此功能。我有什么机会错过一些明显的东西吗?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

我希望我能正确理解你的要求。您可以尝试以下步骤: (通过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,以便消息包含文本文件的内容。 (虽然我不确定提交消息的字符限制)

  5. 希望这会有所帮助。

    编辑:(通过TORTOISESVN)

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

答案 2 :(得分: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 :(得分:0)

我有一些类似的问题,即合并并提交从trunk到branch的更改,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"