【问题标题】:Make SVN Commit also print the diff使 SVN Commit 也打印差异
【发布时间】:2010-10-07 18:53:53
【问题描述】:

当我执行 svn commit 并让我的 svn 编辑器选择它时,我希望 svn 编辑器显示已更改文件的差异,而不仅仅是文件列表。在编写详细的提交消息时确实有助于记忆。关于如何完成的任何想法?

【问题讨论】:

  • 使用 TortoiseSVN(和许多其他),您可以双击该列表中的任何文件以查看差异。您也可以选择多个并右键单击差异。
  • 我说的是终端上的命令行,在该终端上我设置了 SVN_EDITOR 属性,我将其指向 vim 或 textmate,它们会根据我的管道对提交或差异进行自动语法高亮显示给它。
  • @Josh 我可以轻松 svn diff | mate 并查看任何更改的差异,但是当我输入 svn commit 并且 mate 或 vim 加载它时,它当前只是通过 svn status 显示文件列表,我真的很想在下面看到 svn diff 的输出

标签: svn diff


【解决方案1】:

看起来这里的脚本毕竟是有效的。

来自 - http://push.cx/2007/seeing-subversion-diffs-for-commit-messages

需要进行一些更改。我会把整个脚本贴在这里

创建一个文件,将其命名为 svn,在这种情况下它放在 ~/bin 中

#!/bin/sh
REALSVN=/usr/bin/svn

ARGS="$@"

if [ "$1" = "commit" -o "$1" = "ci" ]; then
    shift # pop off $1 for diff
    TEMPLATE=`mktemp -t tmp`
    $REALSVN diff "$@" > "$TEMPLATE"
    $REALSVN $ARGS --editor-cmd="~/bin/svn-diff-editor '$TEMPLATE'"
else
    $REALSVN $ARGS
fi

同时创建一个名为 ~/bin/svn-diff-editor 的文件

echo >> "$2"
cat "$1" >> "$2"
rm "$1"
$SVN_EDITOR "$2"

对于 osx,一旦我将 svn-diff-editor 的最后一行更改为该文件,我必须将“-t tmp”添加到 mktmp,并且 orig 脚本具有我没有的 $VISUAL,而是设置了 $SVN_EDITOR成功了。

【讨论】:

  • 我应该注意,这两个文件都需要 chmod+x'd 并且 ~/bin 应该是你路径中的第一个......或者只是把它放在你路径中真正 svn 前面的任何地方
【解决方案2】:

编写脚本

这需要一些工作,但您可以在前端编写一个脚本作为您的 SVN_EDITOR。 当svn 调用您的 SVN_EDITOR 时,它会传递 svn 生成的临时注释文件的名称,其中包含要提交的受影响文件的摘要列表。

http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.advanced.externaleditors

这些选项或变量中的任何一个的值都是要由 shell 执行的命令行的开头。 Subversion 会在该命令行上附加一个空格和要编辑的临时文件的路径名。因此,要与 Subversion 一起使用,配置或指定的编辑器需要支持其最后一个命令行参数是要编辑的文件的调用,并且它应该能够将文件保存到位并返回零退出代码表示成功。

可以想象,您可以编写一个带有文件名参数的 shell 脚本:

  1. 打开最后一个 arg 指示的文件(svn 临时注释文件)
  2. 为要提交的文件解析它
  3. 在每个修改的(非二进制)文件上运行svn diff,并将差异输出附加到 svn 临时注释文件的末尾
  4. 在修改后的 svn 临时注释文件上调用你的真实编辑器

确保您的脚本返回真实编辑器返回的返回码或 0 表示成功。然后将您的 SVN_EDITOR 环境变量设置为指向您的脚本。

也许有人已经写过这样的脚本,但我找不到(特别是因为你没有指明操作系统)。这个脚本也很有可能会生成一个非常大的文件。

替代方案 - 编写宏

我认为更好的选择是使用可编程编辑器并编写一个宏,该宏从某些选定的行读取文件名,然后在文件上运行 SVN diff - 将结果放在缓冲区或将其附加到当前缓冲区。然后,您可以选择性地突出显示 svn 临时注释文件中的文件,并仅在您需要的关键文件上运行 SVN diff。听起来像是 elisp 的工作!

对不起,我没有现成的代码给你。如果您执行其中任何一项,看到回来并在这里发布您的脚本/宏作为答案会很有趣。

【讨论】:

  • 刚刚找到push.cx/2007/seeing-subversion-diffs-for-commit-messages,但它似乎不适用于osx
  • 我向你卓越的搜索技巧低头。
  • 我接受这个答案,因为它本质上就是我所做的:)
  • @dstarh - 如果你接受你的,我会很好 - 它是一个完整的解决方案,它应该作为未来程序员寻找类似解决方案的第一个答案。
  • 还不让我。以后会做。真的很喜欢这个。尤其是因为我告诉 textmate 它的内容不同并得到了可爱的突出显示
【解决方案3】:

我写了一个简单的脚本并将SVN_EDITOR设置为它的路径:

#!/bin/bash

tmpFile="${!#}"

# Append changes in committed files to tmpFile
echo >> ${tmpFile}
grep '^[MR]' ${tmpFile} | awk '{print $2}' | \
  xargs -n 1 --no-run-if-empty svn diff >> ${tmpFile}

# Run editor
exec ${EDITOR} ${tmpFile}

请注意,它只查找修改过的 (M) 和替换过的 (R) 文件,并假定 EDITOR 已设置。可能不应该尝试区分二进制文件。

【讨论】:

  • 有趣的解决方案。我真的很喜欢 SVN 默认的 diff 输出,这正是我想要的——通常的提交输出只列出文件和状态,但是 svn diff 会为您提供正确的 diff 布局,而不必分别在每个文件上调用 svn diff。
【解决方案4】:

我找不到我喜欢使用的答案。 dstarh 的答案就快到了。但这对我来说太打扰了。如果commit之前有参数怎么办?此外,使用陷阱删除临时文件更安全。为了取悦那些偏执的人,我逃离了编辑器 cmd:

svn-commit.sh:

#!/usr/bin/env bash
set -eu
tmp=`mktemp` _trap="rm -r "$tmp"; ${_trap:-}" && trap "$_trap" EXIT
svn diff "$@" > "$tmp"
# svn diff "$@" | iconv -f utf-8 -t utf-8 -c > "$tmp"   # skip malformed UTF-8 characters
svn commit "$@" "--editor-cmd=svn-editor.sh $(printf %q "$tmp")"

svn-editor.sh:

#!/usr/bin/env bash
set -eu
diff_f=$1
commit_msg_f=$2
# dos2unix "$diff_f"   # if svn repo has files with different line-ending styles
# dos2unix -f "$diff_f"   # to make it always treat diff output as text
echo >> "$commit_msg_f"

cat "$diff_f" >> "$commit_msg_f"
"$EDITOR" "$commit_msg_f"

UPD我遇到了这个错误:

svn: E135000: Commit failed (details follow):
svn: E135000: Error normalizing edited contents to internal format
svn: E135000: Inconsistent line ending style
svn: E135000: Your commit message was left in a temporary file:
svn: E135000:    '.../svn-commit.tmp'

可以考虑在评论中添加dos2unix 命令或其他内容。

UPD另外,你可能想skip malformed UTF-8 characters,否则svn会失败:

svn: E000022: Commit failed (details follow):
svn: E000022: Error normalizing edited contents to internal format
svn: E000022: Valid UTF-8 data
(hex: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2b 0a 2b)
followed by invalid UTF-8 sequence
(hex: a4 20 3d 20)
svn: E000022: Your commit message was left in a temporary file:
svn: E000022:    '.../svn-commit.tmp'

UPD 有时dos2unix 可能会将diff 输出视为二进制:

dos2unix: Binary symbol 0x00 found at line 742308
dos2unix: Skipping binary file /tmp/tmp.UCNcubZZlX
svn: E135000: Commit failed (details follow):
svn: E135000: Error normalizing edited contents to internal format
svn: E135000: Inconsistent line ending style
svn: E135000: Your commit message was left in a temporary file:
svn: E135000:    '.../svn-commit.tmp'

您可能想要强制转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 2014-10-19
    • 2019-06-13
    • 2011-12-21
    • 2021-03-12
    • 1970-01-01
    • 2011-04-26
    • 2017-10-04
    相关资源
    最近更新 更多