【问题标题】:How to make 'svn log' ignore property changes?如何使“svn log”忽略属性更改?
【发布时间】:2010-08-09 08:03:36
【问题描述】:

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

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

【问题讨论】:

  • @Pekka 我没有找到任何适用于此的解决方案。这些问题可能相似,但不是重复的。
  • @zr 对不起。我忽略了另一个问题的差异方面。但是,那里引入的简单 grep 构造不是朝着正确的方向发展吗?
  • @zr 我下面的回答满足需要吗?
  • @zr:你错过了在这里为正确答案提供赏金......哎哟

标签: svn


【解决方案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。 IE。 svn log -v 不输出的 svn URL 的开头部分。

 # 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输出一些错误消息,主要是“找不到路径”,我认为这是针对曾经存在于存储库中但已被移动(重命名)或删除的文件。

这符合您的要求吗?

感谢 this page 上的 Michael Augustin 提供有关 grepping svn diff 的输出以删除仅属性更改的想法。

附: This other page 似乎问了同样的问题,但那里没有完整的答案。

附言编辑了上面的 bash 脚本,在管道末尾添加了一个额外的 | sort | uniq,因为我已经看到了重复项。虽然我不明白它们为什么会发生。

【讨论】:

  • +1! @LarsH:这是 SO 最讨厌的事情之一:赏金系统。这个想法很好,许多人抱怨自动关闭功能,但它仍然存在。我经常看到我的答案被忽略,或者在赏金期结束后被检查为答案。并且看到,在这里,upvotes 来得太晚了,无法赢得赏金......(PS:请参阅 meta.stackoverflow.com 上的一些讨论)
  • @Abel,是的......我花了相当多的时间,并在截止日期前几个小时发布。此外,@zr 在线。但可能忙于另一个问题。所以感谢您投票。我现在已经达到了一个合理的代表门槛,所以失去赏金并不那么重要。
  • 非常感谢,很抱歉没有立即跟进。我在 SO 之外的生活和工作是如此的干扰......我会在冷静期结束后立即付款。
  • 没问题...不要让网站优先于现实生活!谢谢。
【解决方案2】:

看起来不像:SVN log in the Subversion manual

以后可能会过滤掉它们,例如使用 shell 脚本?你用的是什么系统?

【讨论】:

  • 是的。我相信这需要编写一些后处理脚本。我希望有人愿意分享现有的解决方案,而不是重新发明轮子。
  • @zr 当你甚至不透露你需要它工作的操作系统时,这是极其困难的。您应该添加该信息。
  • 我同时使用 Windows 和 Linux。在 Windows 上,我将 Cygwin 集成到我的 shell 中,因此 unix 风格的解决方案应该适用于两个平台。
【解决方案3】:

甚至在四处搜索之前,我得出的结论是,这需要获取日志中的每个修订版并将其传递给 `svn diff' 以查看修订版中的变化。然后我发现了另一个 SO 问题:how to detect modified properties using SVN log

svnlog.py 包含作者和路径的过滤选项,但不包含任何差异集成。你也许可以破解它。

我希望这会有所帮助。

谢谢你,
扎卡里

【讨论】:

    【解决方案4】:

    和你一样,我很遗憾不能告诉 '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 新手,欢迎提出建议。

    【讨论】:

      【解决方案5】:

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

      #!/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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多