Kiedy wykonuję polecenie svn commit i pozwolę mojemu redaktorowi svn odebrać to, KOCHAM dla edytora svn, aby pokazać różnicę plików, które zmieniły się zamiast tylko listy plików. Naprawdę pomaga pobiegać pamięć podczas pisania szczegółowych wiadomości zatwierdzania. Jakieś pomysły, jak to osiągnąć?Niech polecenie SVN również wydrukuje różnicę
Odpowiedz
Wygląda na to, że skrypt działa tutaj.
Z - http://push.cx/2007/seeing-subversion-diffs-for-commit-messages
potrzebne, aby dokonać kilku zmian.Będę wklej cały skrypt tutaj
utworzyć plik, nazwa to svn w tym przypadku to umieścić w ~/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
a także utworzyć plik o nazwie ~/bin/svn-diff-editor
echo >> "$2"
cat "$1" >> "$2"
rm "$1"
$SVN_EDITOR "$2"
dla OSX musiałem dodać „-t tmp” do mktmp i skrypt oryg miał $ VISUAL których nie miałem i miał $ SVN_EDITOR ustawić zamiast raz zmieniłem ostatnią linię sVN-diff -spodziewał się, że zadziałało.
Powinienem zauważyć, że oba pliki muszą być chmod + x'd i ~/bin powinny być pierwszymi na twojej ścieżce ... lub po prostu umieścić to gdziekolwiek, co wyprzedza prawdziwy svn na twojej drodze – dstarh
napisać skrypt
zajęłoby trochę pracy, ale można napisać skrypt do przodu jako swojej SVN_EDITOR. Gdy svn
wywołuje twój SVN_EDITOR, przekazuje nazwę wygenerowanego przez svn tymczasowego pliku komentarza zawierającego listę podsumowującą zaatakowane pliki, które mają zostać zatwierdzone.
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.
Niewykluczone, można napisać skrypt, który przyjmuje parametr nazwa_pliku że:
- otwiera plik wskazywany przez ostatni Arg (svn tymczasowy plik komentarz)
- analizuje to dla plików, które mają zostać zatwierdzone:
- uruchamia
svn diff
na każdym zmodyfikowanym (nie binarnym) pliku i dołącza di Wyjście ff z powrotem do końca svn tymczasowego komentarza pliku - wywołuje twój prawdziwy redaktor na zmodyfikowanym svn tymczasowego komentarza pliku
Upewnij się, że skrypt zwraca kod powrotu zwrócony przez prawdziwego edytora lub 0, aby wskazać sukces . Następnie ustaw swój SVN_EDITOR env var, tak aby wskazywał na skrypt.
Być może ktoś napisał już taki skrypt, ale nie mogłem go znaleźć (zwłaszcza, że nie wskazałeś systemu operacyjnego). Istnieje również duża szansa, że ten skrypt wygeneruje wyjątkowo duży plik.
Alternative - napisać makro
Myślę, że lepszym rozwiązaniem byłoby wykorzystanie programowalny edytor i zaprogramować makro, które odczytać nazwę pliku (ów) z jakiejś wybranej linii (ów), a następnie uruchomić SVN diff w pliku (ach) - umieszczenie wyników w buforze lub dołączenie go do bieżącego bufora. Następnie można selektywnie podświetlić pliki z tymczasowego pliku komentarza svn i uruchomić plik SVN diff tylko na plikach kluczy, których potrzebujesz. Brzmi jak praca dla elisp!
Niestety nie mam gotowego kodu dla ciebie. Jeśli zrobisz któryś z nich, byłoby interesujące, aby wrócić i opublikować skrypt/makro tutaj jako odpowiedź.
napisałem prosty skrypt i ustawić SVN_EDITOR
na swojej drodze:
#!/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}
pamiętać, że patrzy tylko na zmodyfikowanej (M) i zastąpić pliki (R) i zakłada EDITOR
jest ustawiony. Prawdopodobnie nie powinien próbować różnicować plików binarnych.
ciekawe rozwiązanie. Bardzo podoba mi się wyjście diff, które SVN ma domyślnie, i to jest to, czego chciałem - zwykłe wyjście commit pokazuje listę plików i status, ale svn diff da ci odpowiedni układ diff bez konieczności wywoływania svn diff na każdym pliku osobno. – dstarh
Nie mogłem znaleźć odpowiedzi, której chciałbym użyć. dstarh Odpowiedź jest prawie na miejscu. Ale to dla mnie zbyt nachalne. Co jeśli są argumenty przed commit
? Ponadto bezpieczniej jest usunąć plik tymczasowy za pomocą pułapki. I proszę paranoikiem ludowej, ja uciekam CMD Redaktor:
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 Zabrakło mi ten błąd:
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'
Można rozważyć dodanie ng dos2unix
polecenie lub coś, co zostało zrobione w komentarzu.
UPD Dodatkowo możesz skip malformed UTF-8 characters, albo svn zawiedzie:
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 a czasami dos2unix
może leczyć diff
wyjście jako binarny:
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'
Użytkownik może chcę wymusić nawrócenie.
- 1. Jak uzyskać ładną różnicę wizualną dla svn?
- 2. Polecenie uzyskania svn diff bieżącego i poprzedniego numeru wersji
- 3. Polecenie "git pull" działa jak "aktualizacja svn"?
- 4. Czy svn ma polecenie `revert-all`?
- 5. Clojure niech vs Common Lisp niech
- 6. Czy maven wydrukuje krótsze streszczenie reaktora?
- 7. VIM: Jaka jest różnica między Niech G: niech b: itd
- 8. Rx Niech funkcja
- 9. Polecenie do rekurencyjnego usunięcia wszystkich katalogów .svn w systemie Windows
- 10. Czy jest polecenie, aby wyświetlić listę konfliktów SVN?
- 11. Jak wykonać polecenie git svn fetch + rebase w jednej operacji?
- 12. Jak wygenerować dokumentację, uruchamiając polecenie przy każdym zatwierdzeniu svn
- 13. Jak sprawić, aby polecenie svn w teamcity było bardziej szczegółowe?
- 14. Jak mogę znaleźć różnicę svn między kopią roboczą a arbitralnym obrotem?
- 15. Git Diff między HEAD i SVN Master
- 16. subwersja łączy polecenie usuwania
- 17. Niech praca sekwencji dla listy
- 18. Niech vs. wiązanie w Clojure
- 19. Niech babel wyklucza pliki testowe
- 20. Niech deterministically DB do testowania
- 21. "błąd: oczekiwany element, znaleziony" niech ""
- 22. niech i flet w Emacs Lisp
- 23. dlaczego ten program c nie wydrukuje pierwszej instrukcji printf?
- 24. SVN - całkowicie usunąć rewizję z serwera SVN
- 25. Git-SVN: Zaktualizuj repozytorium Git ze scentralizowanego serwera SVN
- 26. Dlaczego polecenie git-svn dcommit zostawia duplikaty commitów w moim repozytorium git? Czy mogę to powstrzymać?
- 27. git - scalanie różnicę oddziałów
- 28. Okrągły nawiasy "()" stworzyć różnicę
- 29. Czy ldd pokazuje również zależności zależności?
- 30. Jak niech Pool.map wziąć funkcję lambda
Z TortoiseSVN (i wieloma innymi) możesz dwukrotnie kliknąć dowolny plik na tej liście, aby zobaczyć różnicę. Możesz także wybrać wiele i kliknąć prawym przyciskiem myszy. – JoshD
Mówię o linii komend na terminalu, w którym ustawiłem właściwość SVN_EDITOR i albo wskażę to na vim, albo na textmate, które automatycznie podświetlają składnię dla commit lub diff, zależnie od tego, do którego go doprowadzę. – dstarh
@Josh mogę łatwo svn diff | Mate i zobacz różnicę wszystkiego, co się zmieniło, ale kiedy piszę svn commit i mate lub vim ładuje, aktualnie pokazuje listę plików przez status svn, naprawdę chciałbym zobaczyć poniżej dane wyjściowe svn diff – dstarh