2010-10-07 21 views
7

Khi tôi thực hiện svn commit và để trình soạn thảo svn của tôi chọn nó, tôi muốn cho trình soạn thảo svn hiển thị sự khác biệt của các tệp đã thay đổi thay vì chỉ danh sách tệp. Thực sự giúp chạy bộ nhớ khi viết tin nhắn cam kết chi tiết. Bất kỳ ý tưởng về cách thực hiện?Làm cho SVN Commit cũng in số khác

+0

Với TortoiseSVN (và nhiều người khác), bạn có thể nhấp đúp vào bất kỳ tệp nào trong danh sách đó để xem khác biệt. Bạn cũng có thể chọn nhiều và nhấp chuột phải. – JoshD

+1

Tôi đang nói dòng lệnh trên một thiết bị đầu cuối nơi tôi đã thiết lập thuộc tính SVN_EDITOR và tôi hoặc là điểm đó để vim hoặc textmate làm cú pháp tự động làm nổi bật cho một trong hai cam kết hoặc khác tùy thuộc vào đó tôi ống cho nó. – dstarh

+0

@Josh tôi có thể dễ dàng svn diff | bạn đời và thấy sự khác biệt của bất cứ điều gì thay đổi nhưng khi tôi gõ svn commit và mate hoặc vim tải nó hiện chỉ hiển thị một danh sách các tập tin thông qua trạng thái svn, tôi thực sự thích dưới đây để xem đầu ra của svn diff – dstarh

Trả lời

6

Dường như tập lệnh ở đây cũng hoạt động.

Từ - http://push.cx/2007/seeing-subversion-diffs-for-commit-messages

cần thiết để thực hiện một vài thay đổi.Tôi sẽ dán toàn bộ kịch bản ở đây

tạo ra một tập tin, tên nó svn trong trường hợp này nó đặt trong ~/bin

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

ARGS="[email protected]" 

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

và cũng tạo một file có tên ~/bin/svn-diff-biên tập viên

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

cho OSX tôi đã phải thêm '-t tmp' để mktmp và kịch bản orig có $ VISUAL mà tôi không có và có $ SVN_EDITOR thiết thay vào đó, một lần tôi đã thay đổi dòng cuối cùng của svn-diff -nhận viên cho rằng nó hoạt động.

+0

Tôi nên lưu ý rằng cả hai tệp cần phải là chmod + x'd và ~/bin phải là người đầu tiên trong đường dẫn của bạn ... svn thực trong con đường của bạn – dstarh

1

Viết một kịch bản

Nó sẽ mất một số công việc, nhưng bạn có thể viết một kịch bản để kết thúc trước khi SVN_EDITOR của bạn. Khi svn gọi SVN_EDITOR của bạn, nó chuyển tên của tệp nhận xét tạm thời do svn tạo có chứa danh sách tóm tắt các tệp bị ảnh hưởng được cam kết.

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

The value of any of these options or variables is the beginning of a command line to be executed by the shell. Subversion appends to that command line a space and the pathname of a temporary file to be edited. So, to be used with Subversion, the configured or specified editor needs to support an invocation in which its last command-line parameter is a file to be edited, and it should be able to save the file in place and return a zero exit code to indicate success.

Có thể hình dung, bạn có thể viết một kịch bản shell mà phải mất một tham số tên tập tin đó:

  1. mở tập tin chỉ định bởi các arg qua (svn tạm bình luận tập tin)
  2. phân tích cú pháp tệp để các tệp được cam kết
  3. chạy svn diff trên mỗi tệp được sửa đổi (không phải nhị phân) và nối thêm ff đầu ra trở lại để kết thúc svn tạm thời tập tin bình luận
  4. gọi biên tập viên thực sự của bạn trên sửa đổi tập tin bình luận svn tạm

Hãy chắc chắn rằng kịch bản của bạn trả về mã trở lại trả về bởi biên tập viên thực sự của bạn hoặc 0 để chỉ thành công . Sau đó đặt SVN_EDITOR env var của bạn để trỏ đến kịch bản của bạn.

Có lẽ ai đó đã viết một tập lệnh như vậy, nhưng tôi không thể tìm thấy một tập lệnh (đặc biệt là vì bạn không chỉ ra một hệ điều hành). Ngoài ra còn có một cơ hội tốt để tập lệnh này có thể tạo ra một tệp cực lớn.

Alternative - viết một macro

Tôi nghĩ rằng một sự thay thế tốt hơn là nên sử dụng một trình soạn thảo có thể lập trình và lập trình một vĩ mô mà đọc một tên file (s) từ một số dòng chọn (s) và sau đó chạy SVN diff trên (các) tệp - đưa kết quả vào bộ đệm hoặc gắn kết vào bộ đệm hiện tại. Sau đó bạn có thể chọn lọc các tập tin từ tập tin bình luận tạm thời svn và chạy SVN diff chỉ trên các tập tin quan trọng bạn cần. Âm thanh như một công việc cho elisp!

Rất tiếc, tôi không có mã sẵn sàng cho bạn. Nếu bạn thực hiện một trong hai điều này, sẽ rất thú vị khi thấy quay lại và đăng tập lệnh/macro của bạn trở lại đây dưới dạng câu trả lời.

+0

Chỉ tìm thấy http : //push.cx/2007/seeing-subversion-diffs-for-commit-messages nhưng nó dường như không hoạt động trên osx – dstarh

+1

Tôi cúi đầu với kỹ năng tìm kiếm cấp trên của bạn. –

+0

nếu chỉ nó sẽ hoạt động:/ – dstarh

0

Tôi đã viết một kịch bản đơn giản và thiết lập SVN_EDITOR để đường đi của nó:

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

Lưu ý rằng nó chỉ tìm kiếm sửa đổi (M) và thay thế (R) tập tin và giả định EDITOR được thiết lập. Có lẽ không nên thử các tệp nhị phân khác.

+0

giải pháp thú vị. Tôi thực sự thích đầu ra diff mà SVN có mặc định đó là những gì tôi muốn - đầu ra cam kết thông thường chỉ liệt kê các tệp và trạng thái, nhưng svn diff sẽ cung cấp cho bạn bố cục khác phù hợp mà không cần phải gọi svn diff trên từng tệp riêng biệt. – dstarh

0

Tôi không thể tìm thấy câu trả lời mà tôi cảm thấy thích sử dụng. dstarh 's câu trả lời là gần như ở đó. Nhưng nó quá xâm phạm với tôi. Điều gì sẽ xảy ra nếu có các đối số trước commit? Ngoài ra, an toàn hơn để xóa tệp tạm thời bằng một cái bẫy. Và để làm hài lòng những dân gian hoang tưởng, tôi thoát khỏi cmd biên tập:

svn-commit.sh:

#!/usr/bin/env bash 
set -eu 
tmp=`mktemp` _trap="rm -r "$tmp"; ${_trap:-}" && trap "$_trap" EXIT 
svn diff "[email protected]" > "$tmp" 
# svn diff "[email protected]" | iconv -f utf-8 -t utf-8 -c > "$tmp" # skip malformed UTF-8 characters 
svn commit "[email protected]" "--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 tôi đã chạy vào lỗi này:

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' 

Người ta có thể xem xét addi ng dos2unix lệnh hoặc một cái gì đó như thực hiện trong các bình luận.

UPD Ngoài ra, bạn có thể muốn skip malformed UTF-8 characters, nếu không svn sẽ thất bại:

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 Và thỉnh thoảng dos2unix có thể đối xử với diff đầu ra như nhị phân:

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' 

Bạn có thể muốn ép buộc chuyển đổi.

Các vấn đề liên quan