2013-05-07 12 views
7

Używam svn diff -c 789, aby pokazać zmiany wprowadzone w wersji 789 naszego oprogramowania, ale pokazuje on wiele plików, których nie obchodzi, w szczególności pliki testowe. Jak wykluczyć pewne pliki z pliku różnic, na przykład wszystkie pliki pasujące do wzorca *Test.java?Jak wykluczyć niektóre pliki z pliku svn diff?

Używam Cygwin w systemie Windows, jeśli to ważne.

+0

Nie jest możliwe, aby wykluczyć jakiekolwiek pliki z 'svn diff'.Możesz użyć narzędzia, które umożliwia filtrowanie (również wykluczanie) zmian z plików, których nie obchodzi, lub napisanie skryptu, który będzie analizował dane wyjściowe pliku 'svn diff', usuwając zmiany z plików, które chcesz wykluczać. Jeśli jesteś zainteresowany takim skryptem, podaj więcej szczegółów na temat swojego środowiska - systemu operacyjnego i powłoki. –

+0

@Adam Używam Cygwin na Windows 7. – MikeFHay

Odpowiedz

5

Jako że svn diff nie pozwala wykluczyć określonych plików z danych wyjściowych, poniżej znajduje się skrypt BASH, który można wykorzystać do osiągnięcia tego.

ona dwa argumenty:

  • file z svn diff wyjściowego
  • pattern plików mają być wyłączone (np test/*)

i drukuje treść file bez zmian z plików pasujących do pattern.

#!/bin/bash 

test $# -ne 2 && echo "Usage: $0 svn_diff_file exclude_pattern" && exit 1 

ignore=0 
while IFS= read -r line; do 
    echo $line | grep -q -e "^Index: " && ignore=0 
    echo $line | grep -e "^Index: " | grep -q -e "^Index: $2" && ignore=1 
    test $ignore -eq 0 && echo "$line" 
done < $1 

Aktualizacja

Właśnie natknąłem się na narzędzie, które wykonuje to zadanie: filterdiff. To użycie jest bardzo podobny do powyższego skryptu:

filterdiff svn_diff_file -x exclude_pattern

+1

Jest to dobre, ale w przypadku ogromnych plików diff lepiej jest wywoływać 'svn diff' na pożądanych plikach niż filtrować różnicę wszystkiego. Zobacz odpowiedź Victora poniżej, jeśli masz takie problemy. – Martin

3

Nawiasem mówiąc, należy pamiętać, że diff svn poleceń działa jak inni komend następujące in Unix modułowej filozofii gdzie każda komenda posiada standardowe wejście i ouput. Możesz utworzyć własny skrypt dostosowujący do plików list, które chcesz uwzględnić, przekierować dane wyjściowe tego skryptu do poleceń svn diff za pomocą rur, a następnie przekieruj dane wyjściowe pliku diff do żądanego pliku, który chcesz utworzyć. Wystarczy być bardziej jasny: pójść za tym przykładem

svn diff `cat change_list.txt` > patch.diff 

w change_list.txt są pliki, które chcesz dołączyć do diff oddzielone spacją. Na przykład, zawartość pliku może być to:

"domena/model/entity.java"

"web_app/controllers/controller.java"

Więc po to podejście , jedyną trudnością twojego problemu jest zredukowanie do wdrożenia skryptu, który podobnie jak Adam hojnie napisał powyżej.

Mam nadzieję, że pomoże!

Vic.

1

To co zrobiłem:

FILES=$(svn status some_dir|grep ^M|cut -b2-|grep -v dir_to_remove) 
test -n "$FILES" && svn diff "$FILES"