SVN: Ignoruj ​​rekursywnie niektóre katalogi

106

Nie chcę, aby jakikolwiek katalog o nazwie buildlub distwchodził do mojego SVN, bez względu na to, jak głęboko jest w drzewie.

czy to możliwe? W git właśnie umieściłem

build
dist

w moim .gitignoreu źródła i rekurencyjnie ignoruje. Jak to zrobić za pomocą svn? Proszę, nie mów mi, żebym robił rekwizyty w każdym reżimie dla rodziców ...

Paul Tarjan
źródło
Sprawdź tę odpowiedź, aby uzyskać natywne rozwiązanie, jeśli używasz Subversion 1.8.
Frank Kusters

Odpowiedzi:

57

Od subversion 1.8 jest teraz svn:global-ignoreswłaściwość, która działa tak samo, svn:ignoreale rekurencyjnie (więc ustaw ją w swoim katalogu najwyższego poziomu)

bliźniak
źródło
3
Jestem trochę zdezorientowany - jest global-ignoresw ~/.subversion/configpliku, ale także dziedziczona svn:global-ignores właściwość ustawiona w katalogu w repozytorium SVN, a także svn:ignore- czy możesz podać podsumowanie tych różnych opcji i ich porównania? Jak --recursivewpływa na nich flaga?
Dai,
2
Zrobiłem własne badania i opublikowałem swoje wyniki w tej odpowiedzi QA: stackoverflow.com/a/86052/159145
Dai
[Próbowałem, ale nie powiodło się, objfolder nadal się wyświetlał] ( stackoverflow.com/questions/50960188/… ), czy możesz mi pomóc rzucić okiem na to?
Łukasz
Czy mogę powiedzieć „build / *”, aby zignorować wszystko poniżej kompilacji w każdym folderze kompilacji?
Johannes Schaub - litb
45

svn propsetprzyjmuje --recursivejako opcję, więc możesz to zrobić, z dwoma wadami:

  1. musisz sprawdzić całe repozytorium (lub przynajmniej wszystkie znajdujące się w nim katalogi) i
  2. musisz pamiętać o ustawianiu svn:ignorewłaściwości za każdym razem, gdy dodajesz nowy katalog
Michael Hackner
źródło
42

Nie jest to możliwe. W Subversion istnieją tylko dwa mechanizmy ignorowania svn:ignore(nierekurencyjne) i global-ignores(które nie są specyficzne dla repozytorium).

Kevin Reid
źródło
7
svn propset --recursive svn: ignore svn_ignore_rules. gdzie svn_ignore_rules to plik zawierający reguły ignorowania - po jednej w każdym wierszu
georg
3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' dla mnie z svn-1.7.6, w innym przypadku rekursywnie ignorujesz pliki o nazwie „svn_ignore_rules” [edytuj: zgodnie z „wytten” w komentarzu poniżej]
elbeardmorez
9
Do komentujących: Jak powiedział pytający: „Proszę, nie mów mi, żebym zrobił rekwizyt do każdego rodzica w reż…”.
Kevin Reid
5
Jest to teraz możliwe w Subversion 1.8
Squirrel
17

To działa dla mnie:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>
Stewart
źródło
2
Dzięki za to, działa świetnie ... Nawiasem mówiąc, jedynym sposobem na zignorowanie zarówno * .txt, jak i * .pdf było umieszczenie tych wzorców w pliku, a następnie użycie opcji 'svn propset --file'
wytten
13

dodaj do swojego pliku ~ / .subversion / config lub / etc / subversion / config:

[miscellany]
global-ignores = build dist
jspcal
źródło
Wolałbym to zrobić per-repo, jeśli mogę
Paul Tarjan
1
hmm nie jestem pewien, czy istnieje łatwy sposób na zrobienie tego na repozytorium, hak przed zatwierdzeniem może odrzucić pewne wzorce, ale nie jest to pełne rozwiązanie. svn: ignore on each parent dir działa, ale nie rekurencyjnie. możesz zamienić swój plik konfiguracyjny skryptem podczas pracy nad różnymi repozytoriami, ale to dodatkowy krok.
jspcal
1
Co oznacza build dist ?
IgorGanapolsky
9

Możliwe jest zignorowanie katalogów kompilacji i dystrybucji poprzez usunięcie katalogów z kontroli wersji. Sztuczka polega na użyciu opcji --keep-local, aby opuścić katalog w kopii roboczej. Na przykład:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Katalog nie będzie już śledzony przez subversion, ale nadal będzie tam w twojej kopii roboczej, aby przechowywać dane wyjściowe kompilatora itp.

okrzyki, joe

jsharit
źródło
7

Na przykład struktura folderów:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Dobrze jest zrobić svn usuwanie zawartości dist przed poleceniem ignorowania, więc dla gałęzi dist będzie puste.

Pracował dla mnie, dziś przetestowany. Oto strona, która trochę to wyjaśnia

marian
źródło
6

Aby zignorować wszystkie takie pliki we wszystkich repozytoriach, możesz dodać a global-ignoresdo pliku konfiguracyjnego dla każdego użytkownika.

W systemach uniksowych ten obszar pojawia się jako katalog o nazwie .subversion w katalogu domowym użytkownika. W systemach Win32 Subversion tworzy folder o nazwie Subversion, zwykle w obszarze danych aplikacji w katalogu profilu użytkownika

Zobacz Opcje konfiguracji

Niestety, nie ma takiej opcji dla repozytorium. Zasadniczo jest to przypadek na użytkownika lub na katalog, więc wielokrotność svn:ignoresjest prawdopodobnie najlepszym rozwiązaniem, tak irytującym, jak to tylko możliwe.

Blair Conrad
źródło
1
Wolałbym to zrobić per-repo, jeśli mogę
Paul Tarjan
Och, więc nie masz szczęścia. Jak mówi @Kevin Reid - masz na katalog lub na użytkownika.
Blair Conrad,
6

Najpierw musisz przejść do górnego folderu kopii roboczej i utworzyć tam plik (powiedzmy .svnignore), w którym powinieneś umieścić wszystkie wzorce, które chcesz zignorować, na przykład (dla projektu Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Następnie uruchamiasz następujące polecenie (pamiętaj, że musisz znajdować się w górnym folderze kopii roboczej):

svn propset svn:ignore -R -F .svnignore .

Będzie to działać tylko w przypadku folderów i plików, które nie są jeszcze objęte kontrolą wersji. Jeśli chcesz, aby folder (lub plik), który jest objęty wersjonowaniem, również zaczął być ignorowany, usuń go z kontroli wersji, uruchamiając polecenie:

svn rm --keep-local <path>

Wszystko to wyjaśniam w tym świetnym artykule: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

Luccas Correa
źródło
To było niezwykle pomocne. To najlepszy sposób, jaki znalazłem, aby uzyskać zachowanie ignorowania w stylu git w svn. Dziękuję bardzo.
Jonathan Wilson
6

W subversion 1.8 powyżej, możliwe jest ustawienie globalnych ignorowań dla bieżącego repozytorium.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Możesz także utworzyć folder o nazwie .svnignore i zapisać warunki.

build
dist

pamiętaj o jednym warunku na linię, ustawienie build / * lub dist / debug jest daremne. Następnie wykonaj polecenie:

svn propset svn:global-ignores -F .svnignore .
John Zhu
źródło
działa bez zarzutu! po prostu uruchom pierwszą komendę na nowo wyewidencjonowanym repozytorium.
gaurav
3

Utwórz plik i dodaj do niego swoje ignorowania

lista-ingore:

file1 
directory1
file2
etc...

następnie zastosuj następujące polecenie

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

katalog to nazwa twojego katalogu, możesz również podzielić na podkategorie katalog / podkatalog. Lub użyj *, aby zaznaczyć bieżący katalog, w którym się znajdujesz.

Zakłada się, że używasz basha jako powłoki

jncc99
źródło
Co tu jest $ n ?
IgorGanapolsky
1
@igor Ganapolsky - $ n jest zmienną pętli for. Zostanie ustawiony jako indeks sekwencji, w której się przechodzisz; w tym przypadku katalog określony przez „katalog” w powyższym przykładzie.
jncc99,
3
svn propset --recursive svn:ignore svn_ignore_rules .

gdzie svn_ignore_rules to plik zawierający reguły ignorowania - po jednej w każdym wierszu

Oczywiście za każdym razem, gdy dodajesz nowy katalog do repozytorium, musisz go ponownie uruchamiać

svn_ignore_rules można również uznać za wpisane do repozytorium, do ponownego wykorzystania przez innych użytkowników mających uprawnienia do zapisu w repozytorium

Georg
źródło
2
cd katalog_nadrzędny # katalog zawierający folder, który ma być rekursywnie ignorowany
svn propedit svn: ignore. # otworzy svn-prop.tmp
zarejestruj folder (y)
^ X
Y
commit -m 'ignore target direcoty'
Moin Haidar
źródło
pomogło mi, miałem problem z ustawieniem wzorca folderu, SVN przestrzegał tego folderu nie w repozytorium set EDITOR=notepad, svn propedit svn:ignore .działało dobrze ...
Betlista
1

Ponieważ wydaje się, że nie ma rozwiązania tego prawdopodobnie powszechnego problemu, chciałbym podzielić się naszym rozwiązaniem. Jak inni już wyjaśnili, możesz albo użyć svn:ignorewłaściwości, dotyczy to pojedynczego katalogu (a zatem nie dla nowych), albo użyć tego, global-ignoresktóry dotyczy jednego użytkownika (ale nie należy do repozytorium).

Aby trochę ułatwić życie, stworzyłem plik reg o nazwie Settings.Svn.regi dodałem go do katalogu głównego repozytorium. Teraz każdy może raz dwukrotnie kliknąć ten plik regfile i mieć gotowe ustawienia.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Naprawdę byłbym wdzięczny za rozwiązanie w repozytorium SVN, więc jeśli ktoś wie, czy zechciałbyś się nim podzielić?

martinstoeckli
źródło
0

Jednym ze sposobów byłoby dodanie pewnego rodzaju czeku do haka przed lub po zatwierdzeniu, ale uwaga jest prosta, jeśli nie jesteś właścicielem serwera repo.

8DH
źródło