当我做svn提交并让我的svn编辑器拿起它时,我喜欢svn编辑器显示已更改的文件的差异而不仅仅是文件列表。在编写详细的提交消息时,真的有助于慢慢记忆。关于如何完成的任何想法?
答案 0 :(得分:7)
看起来这里的脚本毕竟有效。
从 - 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我必须将'-t tmp'添加到mktmp并且orig脚本有$ VISUAL我没有并且设置了$ SVN_EDITOR,一旦我将svn-diff-editor的最后一行更改为它奏效了。
答案 1 :(得分:1)
编写脚本
这需要一些工作,但你可以在前端编写一个脚本作为你的SVN_EDITOR。
当svn
调用您的SVN_EDITOR时,它会传递一个svn生成的临时注释文件的名称,该文件包含要提交的受影响文件的摘要列表。
http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.advanced.externaleditors
任何这些选项或变量的值都是shell要执行的命令行的开头。 Subversion将该空间和要编辑的临时文件的路径名附加到该命令行。因此,要与Subversion一起使用,配置或指定的编辑器需要支持其最后一个命令行参数是要编辑的文件的调用,并且应该能够将文件保存到位并返回零退出代码表示成功。
可以想象,你可以编写一个带有文件名参数的shell脚本:
svn diff
并将diff输出追加到svn临时注释文件的末尾确保您的脚本返回真实编辑器返回的返回码或0表示成功。然后将SVN_EDITOR env var设置为指向脚本。
也许有人已经编写了这样的脚本,但我找不到(特别是因为你没有指明操作系统)。这个脚本很可能会生成一个非常大的文件。
替代方案 - 编写宏
我认为更好的选择是使用可编程编辑器并编程从某些选定行读取文件名的宏,然后在文件上运行SVN diff - 将结果放入缓冲或将其附加到当前缓冲区。然后,您可以选择性地突出显示svn临时注释文件中的文件,并仅在您需要的密钥文件上运行SVN diff。听起来像是elisp的工作!
抱歉,我没有现成的代码。如果您执行其中任何一项操作,那么返回并将您的脚本/宏发布回此处作为答案将会很有趣。
答案 2 :(得分:0)
我写了一个简单的脚本并将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
。应该不要尝试区分二进制文件。
答案 3 :(得分:0)
我无法找到我想要使用的答案。 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'
您可能想要强制转换。