繁体   English   中英

如何使'svn log'忽略属性更改?

[英]How to make 'svn log' ignore property changes?

'svn log'显示以下日志:1)内容已更改的文件和/或2)属性已更改的文件。

有没有办法只显示案例1适用的文件?

'svn log'显示以下日志:1)内容已更改的文件和/或2)属性已更改的文件。

如您所知,svn log的输出是由提交日志消息而不是文件组织的。 如果使用详细模式(-v),它将显示与每个日志条目关联的文件(“路径”)。 但是,其中一些路径可能位于请求的目标之外(默认值:您当前的目录)。 您是否希望结果包含这些外部路径? 我想从表面上看你的问题,你只是要求过滤,所以是的,你会想要那些外部路径,如果它们代表文件的内容更改。

这是一个解决方案。 它可能很慢,但我测试了它,它在Windows 7上的cygwin中工作。(不要忘记,确保你的脚本有单行结尾!如有必要,请使用dos2unix)

它实际上只有一条长线,除了一个外部的sed脚本(一个真正的黑客可以放在命令行上,但生活很短,可能会搞乱命令行转义):

#!/bin/sh

# These paths are set up for cygwin
SED=/bin/sed
SORT=/bin/sort
UNIQ=/bin/uniq
XARGS=/bin/xargs
GREP=/bin/grep
SVN=svn

# Add desired log options here
LOG_OPTIONS=-v
SINCE_REV=10800
SED_SCRIPT=/cygdrive/c/temp/get-paths.sed
# Make sure you edit the sed script referenced above
# to set the base URL of your repository.

# 1) generate the list of log messages, including affected paths (svn log -v)
# 2) process out those paths (sed)
# 3) eliminate duplicates (sort | uniq)
# 4) get the change history for each of those paths (svn diff)
# 5) filter out the ones that involve only property changes (sed)
# 6) eliminate duplicates again (sort | uniq)
$SVN log $LOG_OPTIONS | $SED -n -f $SED_SCRIPT | $SORT | $UNIQ \
 | $XARGS -n20 -I PATHS $SVN diff -r $SINCE_REV --summarize PATHS 2> error.log \
 | $SED -n 's/^[^ ].... *//p' | $SORT | $UNIQ

这是外部sed脚本。 请务必将svn存储库基本URL更改为存储库的正确基本URL。 即svn URL的开头部分,不是由svn log -v输出的。

 # sed script to output all lines between
 # /^Changed paths:$/ and /^$/, exclusive.
 # Also removes first 5 columns (status) and replaces them with svn repository base url.

 /^Changed paths:$/,/^$/ {
   /^Changed paths:$/b
   /^$/b
   s|^.....|https://svn.myrepo.org/prefix|
   s/ (from .*)$//
   p
}

该脚本将向error.log输出一些错误消息,主要是“找不到路径”,我相信这些文件曾经存在于存储库中但已被移动(重命名)或删除。

这符合您的要求吗?

感谢迈克尔·奥古斯丁在这个页面上提供了关于greting svn diff输出以删除仅属性更改的想法。

PS 这另一页似乎问了同样的问题,但那里没有完整的答案。

PPS编辑上面的bash脚本添加额外的| sort | uniq | sort | uniq | sort | uniq到管道的尽头,因为我看到重复出现在那里。 虽然我不明白他们为什么会这样。

看起来不像: SVN登录Subversion手册

也许之后过滤它们,例如使用shell脚本? 你在用什么系统?

和你一样,令我遗憾的是,'svn log'无法被告知只列出文件内容发生变化的修订版。

每个其他建议都需要我没有安装的东西,所以我创建了一个适合我需求的版本(查询单个文件),只需要sh + awk。 将以下内容放在“svn-log-contents.sh”中:

#!/bin/sh

while [ ! -z "$1" ]; do
   file="$1"
   base=`basename "$file"`
   echo "$base ($file)"
   shift
   svn log -v $file | \
      awk "/^r([1-9]+)/ { r=\$1 } /^ *[MAD] .*$base$/ { \
           system(\"svn log -l 1 -r \" r \" $file\") }"
done

使用'chmod a + x svn-log-contents.sh'使其可执行,然后在命令行上提供文件名:

./svn-log-contents.sh file.txt

第一个正则表达式(/ ^ r [1-9] /)在变量r中获取每个修订号。 下一个正则表达式('/ ^ * [MAD] ... /')仅在文件以显着方式被修改时触发,此时它将在该一个修订版上运行'svn log'。 我是一个awk新手,欢迎提出建议。

甚至在搜索之前我得出结论,这将需要在日志中进行每个修订并将其传递给`svn diff'以查看修订版中的更改。 然后我发现了另外这个问题: 如何使用SVN日志检测修改后的属性

svnlog.py包含作者和路径的过滤选项,但不包括任何diff集成。 你可能能够破解它。

我希望这有帮助。

谢谢,
扎卡里

这是一种仅显示真实文件更改日志的方法,忽略属性更改:

#!/bin/sh

for i in $(svn log --xml --with-no-revprops | xml sel -t -m "/log/logentry" -v "@revision" -o " "); do
    j=$(svn diff -c $i --summarize | grep -v "^ ")
    if [ -n "$j" ]; then
        svn log -c $i
    fi
done

以上需要安装xmlstarlet。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM