Jak zignorować pliki w Subversion?

645

Jak zignorować pliki w Subversion?

Jak znaleźć pliki, które nie podlegają kontroli wersji?

andyuk
źródło
Fajnie jest widzieć, jak każde proste pytanie (prawdopodobnie od użytkownika git) oznacza wiele skomplikowanych odpowiedzi. Jeśli tak się stanie, to dziecko Subversion.
Valerio Bozz

Odpowiedzi:

738

(Ta odpowiedź została zaktualizowana, aby pasowała do zachowania SVN 1.8 i 1.9)

Masz 2 pytania:

Oznaczanie plików jako ignorowane:

Przez „plik ignorowany” mam na myśli, że plik nie pojawi się na listach nawet jako „niewersjonowany”: twój klient SVN będzie udawał, że plik w ogóle nie istnieje w systemie plików.

Zignorowane pliki są określane przez „wzorzec pliku”. Składnia i format wzorców plików wyjaśniono w dokumentacji online SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html „Wzorce plików w Subversion”.

Subversion, począwszy od wersji 1.8 (czerwiec 2013) i późniejszych, obsługuje 3 różne sposoby określania wzorców plików. Oto podsumowanie z przykładami:

1 - Obszar konfiguracji środowiska wykonawczego - global-ignoresopcja:

  • Jest to ustawienie tylko po stronie klienta , więc twojeglobal-ignores lista nie będzie udostępniana przez innych użytkowników i dotyczy wszystkich repozytoriów, które kasujesz na swój komputer.
  • To ustawienie jest zdefiniowane w pliku obszaru konfiguracji środowiska wykonawczego:
    • Windows (oparty na plikach) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (oparty na rejestrze) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoreszarówno w, jak HKLMi HKCU.
    • Linux / Unix - ~/.subversion/config

2 - svn:ignoreWłaściwość ustawiona na katalogi (nie pliki):

  • Jest to przechowywane w repozytorium, więc inni użytkownicy będą mieli te same pliki ignorowania. Podobnie jak .gitignoredziała.
  • svn:ignorejest stosowany do katalogów i nie jest rekurencyjny ani dziedziczony. Dowolny plik lub bezpośredni podkatalog katalogu nadrzędnego pasujący do Wzorca pliku zostanie wykluczony.
  • Podczas gdy SVN 1.8 dodaje pojęcie „odziedziczonych właściwości”, svn:ignoresama właściwość jest ignorowana w nie-bezpośrednich katalogach potomnych:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Więc plik ./subdirectory/ignoreThisnie jest ignorowany, nawet jeśli „ ignoreThis.txt” jest stosowany w .katalogu głównym repo).

  • Dlatego, aby zastosować listę ignorowanych rekurencyjnie, musisz użyć svn propset svn:ignore <filePattern> . --recursive.

    • Spowoduje to utworzenie kopii właściwości w każdym podkatalogu.
    • Jeśli <filePattern>wartość jest inna w katalogu potomnym, wówczas wartość dziecka całkowicie przesłania rodziców, więc nie ma efektu „addytywnego”.
    • Jeśli więc zmienisz <filePattern>katalog główny ., musisz go zmienić, --recursiveaby nadpisać katalogi potomne i potomne.
  • Zauważam, że składnia wiersza poleceń jest sprzeczna z intuicją.

    • Zacząłem od założenia, że ​​zignorujesz plik w SVN, wpisując coś w stylu, svn ignore pathToFileToIgnore.txtjednak nie w ten sposób działa funkcja ignorowania SVN.

3- svn:global-ignoresWłaściwość. Wymaga SVN 1.8 (czerwiec 2013):

  • Jest to podobne do svn:ignore, z tym wyjątkiem, że wykorzystuje funkcję „odziedziczonych właściwości” SVN 1.8.
  • Dla porównania svn:ignorewzorzec pliku jest automatycznie stosowany w każdym katalogu potomnym (nie tylko w bezpośrednim potomku).
    • Oznacza to, że ustawianie svn:global-ignoresza pomocą --recursiveflagi nie jest konieczne , ponieważ odziedziczone wzorce ignorowanych plików są automatycznie stosowane podczas dziedziczenia.
  • Uruchamianie tego samego zestawu poleceń, co w poprzednim przykładzie, ale svn:global-ignoreszamiast tego:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Dla użytkowników TortoiseSVN:

Cały ten układ był dla mnie mylący, ponieważ terminologia TortoiseSVN (stosowana w systemie menu Eksploratora Windows) początkowo była dla mnie myląca - nie byłem pewien, jakie znaczenie mają opcje „Dodaj rekurencyjnie”, „Dodaj *” i „Dodaj” menu Ignoruj opcje Mam nadzieję, że ten post wyjaśnia, w jaki sposób funkcja Ignoruj ​​łączy się z funkcją Właściwości SVN. To powiedziawszy, sugeruję użycie wiersza polecenia do ustawienia ignorowanych plików, abyś poczuł, jak to działa zamiast używania GUI, i używanie GUI tylko do manipulowania właściwościami, gdy nie masz problemów z wierszem poleceń.

Lista plików, które są ignorowane:

Polecenie svn statusukryje zignorowane pliki (to znaczy pliki, które pasują do global-ignoreswzorca RGA lub pasują do svn:ignorewzorca bezpośredniego katalogu nadrzędnego lub pasują do dowolnego katalogu przodkasvn:global-ignores .

Użyj --no-ignoreopcji, aby wyświetlić te pliki na liście. Zignorowane pliki mają status I, a następnie przesyłają dane wyjściowe do potokugrep tylko linie rozpoczynające się od „I”.

Polecenie to:

svn status --no-ignore | grep "^I"

Na przykład:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

ta-da!

andyuk
źródło
6
Aby znaleźć zignorowane pliki: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen
3
jeśli chcesz zignorować plik ./FolderA/FolderB/FileToIgnore, zrób to ze swojego. folder: svn propset svn: ignore "FileToIgnore" FolderA / FolderB /
jnj
8
jeśli używasz ssh'ing svn propedit svn:ignore .i nie masz skonfigurowanego edytora tekstu, pojawi się komunikat o błędzie svn: E205007: Żadna ze zmiennych środowiskowych SVN_EDITOR, VISUAL ani EDITOR nie jest ustawiona, a żadna opcja konfiguracji „edytora-cmd” nie była ustawiona znaleziono zamiast otwierania edytora. Podaj więc --editor-cmd nano w ten sposóbsvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez
12
Możesz również zignorować pliki o określonej nazwie we wszystkich podfolderach, używając argumentu „--recursive”. tj. svn propset svn: ignore "* .jpg". --recursive
templariusz
2
Prostszą alternatywą dla awk jest grep:svn status | grep '^?'
Johnride
91

Użyj następującego polecenia, aby utworzyć listę nie znajdującą się w plikach kontroli wersji.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Następnie edytuj plik, aby pozostawić tylko pliki, które chcesz zignorować . Następnie użyj tego, aby zignorować pliki wymienione w pliku:

svn propset svn:ignore -F ignoring.txt .

Zwróć uwagę na kropkę na końcu linii. Informuje SVN, że właściwość jest ustawiana w bieżącym katalogu.

Usuń plik:

rm ignoring.txt

Wreszcie dokonaj,

svn ci --message "ignoring some files"

Następnie możesz sprawdzić, które pliki są ignorowane poprzez:

svn proplist -v
ulitosCoder
źródło
2
Miły. Niewielka poprawa to svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel
4
po co usuwać plik? zachowaj go w repozytorium, jeśli chcesz ponownie utworzyć / dodać / usunąć
tgkprog
Uwaga: to rozwiązanie nie zignoruje plików w podkatalogach (nawet jeśli pojawią się w pliku ignoring.txt).
shaneb
Czy to utrzymałoby istniejące ignorowanie? Jeśli nie, jak to zrobić w jednym poleceniu (tj. --No-ignoruje i zachowuje również wiersze poprzedzone I)?
a1an
Spowodowałoby to zastąpienie bieżących ignorowanych, spróbuj: svn pg svn:ignore . >> ignore.txtpo pierwszym poleceniu dołączenia bieżących ignorowanych do pliku.
ulitosCoder
54

. podejście jak gitignore

Możesz zignorować plik lub katalog, taki jak .gitignore. Wystarczy utworzyć plik tekstowy z listą katalogów / plików, które chcesz zignorować i uruchomić poniższy kod:

svn propset svn:ignore -F ignorelist.txt .

LUB jeśli nie chcesz używać pliku tekstowego, możesz to zrobić w następujący sposób:

svn propset svn:ignore "first
 second
 third" .

Źródło: Karsten's Blog - Ustaw svn: ignore dla wielu plików z wiersza poleceń

Adrian Enriquez
źródło
1
Zauważ, że jeśli później zmodyfikujesz plik zignorowany, musisz ponownie uruchomić svn:ignorepolecenie (patrz stackoverflow.com/a/58380306/189518 )
Sensei James
50

Jeśli używasz TortoiseSVN , kliknij plik prawym przyciskiem myszy, a następnie wybierz TortoiseSVN / Dodaj, aby zignorować listę . Spowoduje to dodanie pliku / symbolu wieloznacznego do plikusvn:ignore właściwości.

svn:ignorezostaną sprawdzone podczas wpisywania plików, a pasujące pliki zostaną zignorowane. Mam następującą listę ignorowania dla projektu Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Tę listę można znaleźć w menu kontekstowym w TortoiseSVN / Properties .

artur02
źródło
26

Jak się wydaje, nikt o tym nie wspominał ...

svn propedit svn:ignore .

Następnie edytuj zawartość pliku, aby określić wzorce do zignorowania, zamknij edytor i gotowe.

Yorick
źródło
3
Ta odpowiedź była przydatna. W moim przypadku musiałem zmienić „.” do podkatalogu pliku, który chciałem zignorować i po prostu określić wzorzec pliku. Ponadto po raz pierwszy musiałem uruchomić to (jestem na komputerze Mac): export SVN_EDITOR = "nano"
Elijah Lofgren
22

Znalazłem artykuł .svnignore Przykład dla Javy .

Przykład: .svnignore dla Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

I potem:

svn propset svn:ignore -F .svnignore .

Przykłady .gitignore. Możesz użyć dla swojego .svnignore

https://github.com/github/gitignore

d.danailov
źródło
1
zrobiłem jak powiedziałeś ... ale kiedy uruchamiam status svn. nadal pokazuje ignorowane pliki za pomocą „?”
Harshit Gupta
Nigdy nie sprawdzałem ze statusem svn, ale ze svn add *, a potem svn commit, ignorowanie plików nie jest zatwierdzane.
d.danailov
jeśli plik „a.txt” jest już w kontroli wersji, wówczas ignorowanie odbywa się za pomocą polecenia takiego jak „svn propset svn: ignore -F .svnignore a.txt”? czy to jest poprawne ?
errakeshpd
Jeśli dodasz „a.txt” do pliku .svnignore, nie jestem pewien, ale polecenie powinno być prawidłowe.
d.danailov
10

Podczas korzystania z propedit upewnij się, że nie ma żadnych spacji końcowych, ponieważ spowoduje to wykluczenie pliku z listy ignorowanych.

Są one wstawiane automatycznie, jeśli używasz autouzupełniania tabulatorów w systemie Linux, aby utworzyć plik na początek:

svn propset svn:ignore 'file1
file2' .
Kenneth
źródło
6
Działa to tylko w przypadku niektórych powłok, takich jak bash. Zauważ, że ponowne wydanie polecenia propset zastępuje poprzedni zestaw wzorców.
JA Faucett,
Czy plik 1 i plik 2 muszą znajdować się w osobnych wierszach?
IgorGanapolsky
8

Innym rozwiązaniem jest:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

lub linia po linii

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Co to robi:

  1. Pobiera pliki statusu z svn
  2. Zapisuje wszystkie pliki za pomocą ?do pliku „svnignore.txt”
  3. Pobiera już zignorowane pliki i dołącza je do pliku „svnignore.txt”
  4. Informuje svn, aby zignorował pliki w pliku „svnignore.txt”
  5. Usuwa plik
bkbilly
źródło
8

Ponadto, jeśli używasz Tortoise SVN, możesz to zrobić:

  1. W menu kontekstowym wybierz „TortoiseSVN”, a następnie „Właściwości”
  2. W wyświetlonym oknie kliknij „Nowy”, a następnie „Zaawansowane”
  3. W wyświetlonym oknie naprzeciwko „Nazwa właściwości” wybierz lub wpisz „svn: ignore”, przeciwnie do „Wartość właściwości” wpisz żądaną nazwę pliku lub nazwę folderu lub maskę pliku (w moim przypadku było to „* / target”), kliknij „Zastosuj właściwość rekurencyjnie ”
  4. Ok. Ok.
  5. Popełnić
msangel
źródło
6
  1. cd ~ / .subversion
  2. otwórz konfigurację
  3. znajdź linię typu „globalne ignoruje”
  4. ustaw ignorowany typ pliku w następujący sposób: global-ignoruje = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store Dane wyjściowe modułów_węzła
范 陆 离
źródło
Dziękuję, twoja odpowiedź jest jedyną, która wspomina o configpliku.
Henrique de Sousa
Ta odpowiedź wspomina o tym również @HenriquedeSousa stackoverflow.com/a/86052/7724, a także wyjaśnia, że ​​jest to lokalny sposób ignorowania plików tylko przez lokalnego klienta.
bzlm
5

Bardziej czytelna wersja odpowiedzi bkbilly:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Co to robi:

  1. Pobiera pliki statusu z svn
  2. Zapisuje wszystkie pliki za pomocą ? do pliku „svnignore.txt”
  3. Pobiera już zignorowane pliki i dołącza je do pliku „svnignore.txt”
  4. Informuje svn, aby zignorował pliki w pliku „svnignore.txt”
  5. Usuwa plik
LivingDust
źródło
Podoba mi się odpowiedź bkbilly, ale ta wersja łamie każdą linię, aby była bardziej czytelna, i usuwa &&, który w moich testach nic nie zrobił, ponieważ pierwsza linia zawsze tworzy plik tymczasowy, a ten sam plik tymczasowy zawsze trafia na listę ignorowanych.
LivingDust,
W tym przypadku propozycja edycji byłaby bardziej odpowiednia. Doceń wysiłek!
Jim
Nie miałem jeszcze wystarczającej reputacji, aby zaproponować edycję. ale nie chcę zepsuć dobrego protokołu. Czy istnieje prosty CZYTNIK na temat wskazówek, kiedy lepiej sugerować i edytować, niż publikować nową odpowiedź itp.?
LivingDust,
1
Jeśli twoja odpowiedź jest dokładnie taka sama jak ta opublikowana półtora roku temu, jest całkiem prosta. Skopiowałeś nawet wyjaśnienie „ Co robi ”.
Jim
3

Możesz także ustawić globalny wzorzec ignorowania w pliku konfiguracyjnym SVN.

petr k.
źródło
1
Czy możesz ustawić wzorzec ignorowania dla konkretnego repozytorium?
David Doria
2

Użyj polecenia svn status na kopii roboczej, aby wyświetlić status plików, pliki, które nie są jeszcze pod kontrolą wersji (i nie są ignorowane), będą miały znak zapytania obok nich.

Jeśli chodzi o ignorowanie plików, musisz edytować właściwość svn: ignore, przeczytaj rozdział Ignorowanie niewersjonowanych elementów w książce svnbook pod adresem http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. HTML . Książka opisuje także więcej na temat używania statusu svn.

Andreas Holstenson
źródło
2

SVN ignore jest łatwy w zarządzaniu w TortoiseSVN. Otwórz TortoiseSVN i kliknij menu pliku prawym przyciskiem myszy, a następnie wybierz Dodaj, aby zignorować listę.

Spowoduje to dodanie plików do svn:ignorewłaściwości. Gdy sprawdzamy te pliki, wówczas plik, który jest zgodny z svn:ignoretym, zostanie zignorowany i nie zostanie zatwierdzony.

W projekcie Visual Studio dodaliśmy następujące pliki do zignorowania:

bin obj
*.exe
*.dll
*.pdb
*.suo

Za pomocą tej metody z powodzeniem zarządzamy kodem źródłowym w SVN Comparetrap

Luźny
źródło
2

Co dla mnie zadziałało:

Jak zignorować pliki w Subversion?
1. W Eksploratorze plików kliknij prawym przyciskiem myszy nazwę folderu projektu SVN
2. Kliknij „SVN Commit ...”
3. Pojawi się okno „zatwierdzenia”
4. Kliknij prawym przyciskiem myszy folder / plik, który chcesz zignorować
5. Kliknij Dodaj, aby zignorować listę.
6. Wybierz folder / plik.
7. Zatwierdź „zmianę właściwości” na SVN.

Jak znaleźć pliki, które nie podlegają kontroli wersji?
Po kroku 3 powyżej kliknij „Pokaż niewersjonowane pliki”

skoki_monkey
źródło
0
  1. otwórz, korzystasz z produktu JetBrains (tj. Pycharm)
  2. następnie kliknij przycisk „zatwierdzenia” na górnym pasku narzędzi lub użyj skrótu „ctrl + k” screenshot_toolbar
  3. w interfejsie zatwierdzania przenieś niechciane pliki na inną listę zmian w następujący sposób. screenshot_commit_change
  4. następnym razem możesz zatwierdzić tylko domyślną listę zmian.
G. Googol
źródło