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
Trả lời
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.
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
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 đó:
- mở tập tin chỉ định bởi các arg qua (svn tạm bình luận tập tin)
- phân tích cú pháp tệp để các tệp được cam kết
- 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 - 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.
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.
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
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.
- 1. Làm thế nào để gửi stdout cho người dùng khi chạy SVN pre-commit hook
- 2. Tortoise SVN Commit bỏ chọn theo mặc định
- 3. Làm thế nào để in số dòng với đổ lỗi svn?
- 4. In cuối 10/20/... svn thông điệp tường trình khác với
- 5. Số giao dịch sau EXECUTE cho biết số câu lệnh BEGIN và COMMIT không khớp. Số đếm trước
- 6. git commit Bạn có một số dòng vá đáng ngờ
- 7. SVN: Thêm màu sắc trên dòng lệnh svn với awk (in bash)
- 8. commit-pull-merge-push hoặc pull-merge-commit-push?
- 9. SQLAlchemy: Sự khác biệt giữa flush() và commit() là gì?
- 10. Tạo Commge Commit thay thế chúng ta bằng số
- 11. SVN Commit Lỗi (không thể thực hiện thao tác nguyên tử)
- 12. không% d trong String.format() làm việc cho số nguyên unsigned cũng?
- 13. Làm cách nào để xem 10 lần commit cuối cùng theo thứ tự đảo ngược với SVN?
- 14. git commit -a confused
- 15. SVN sau cam kết - cho phép từ chối để .svn/khóa
- 16. COMMIT HOẶC conn.setAutoCommit (đúng)
- 17. git svn đối số mơ hồ 'HEAD'
- 18. Rebase commit merge
- 19. SVN 1.7.1 Số phát hành
- 20. Lệnh lấy số svn khác với số phiên bản hiện tại và trước đó
- 21. Hooks cho git-svn
- 22. jQuery US Tiền tệ validation regex để cho phép toàn bộ số cũng
- 23. Làm cách nào để hạn chế số lượng số thập phân được in cho gấp đôi?
- 24. Xóa tất cả các tệp cho git commit?
- 25. Làm thế nào để có được một khác biệt khá trực quan cho svn?
- 26. Can not Commit với SVN - CHECKOUT chỉ có thể được thực hiện trên một tài nguyên phiên bản [lúc này]
- 27. git svn: mật khẩu cho svn không được lưu trữ
- 28. git commit directory
- 29. Git-Tfs: Một thay đổi TFS cho mỗi Commit Git?
- 30. Có sự khác nhau giữa bản sao svn và chi nhánh svn không?
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
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
@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