Jak zignorować katalog z SVN?


760

Właśnie zacząłem używać SVN i mam katalog pamięci podręcznej, którego nie potrzebuję pod kontrolą źródła. Jak mogę zignorować cały katalog / folder SVN?

Używam Versions i TextMate w OS X i wierszu poleceń.


3
Odpowiedzi na podobne pytanie tutaj [SVN kasa zignoruj ​​folder] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
— mloskot

Możliwy duplikat Jak zignorować pliki w Subversion? (Nie obchodzi mnie zbytnio, w którą stronę idzie duplikat; żaden zestaw odpowiedzi nie jest oczywiście lepszy od drugiego.)
— Jeffrey Bosboom,

Odpowiedzi:


796

Ustaw svn:ignorewłaściwość katalogu nadrzędnego:

svn propset svn:ignore dirname .

Jeśli masz wiele rzeczy do zignorowania, oddziel je znakiem nowej linii w wartości właściwości. W takim przypadku łatwiej jest edytować wartość właściwości za pomocą zewnętrznego edytora:

svn propedit svn:ignore .

2
@Kouber: Problem polega na tym, że rozszerzenie powłoki nie wie o właściwościach svn: ignore. Zatem użycie „*” jako parametru explicityl przekazuje tmp do komendy commit. Spróbuj czegoś takiego jak „svn commit -m„ More accents ”.”
— MarkusSchaber

4
Dziękuję za odpowiedź. Pico jako redaktor: svn propedit svn: ignore. --editor-cmd pico
— hade

157
Uwaga: To nie zadziała, jeśli katalog jest już „in” svn. svn rm --keep-local dirnamepierwszy. (Mój wynik svn statystyki był ogromny i wpadłem na to przez chwilę.)
— Erik Aronesty

10
Jeśli chcesz zignorować więcej niż jeden plik / folder, dodaj wszystkie ich nazwy do pliku txt, po jednym wierszu, i użyj następującego wariantu:svn propset svn:ignore -F file.txt .
— petervaz

2
Uważaj, aby ustawić, svn:ignorea nie svn::ignoretak jak ja. Możesz ustawić dowolne właściwości, więc ta druga będzie ustawiona OK, a będziesz mógł zobaczyć i edytować właściwość, ale nie spowoduje to, że SVN zignoruje wymienione pliki.
— Richard Turner,

406

Oto przykładowa struktura katalogów:

\project
    \source
    \cache
    \other

Gdy projectzobaczysz, że twój katalog pamięci podręcznej nie został dodany i jako taki jest wyświetlany.

> svn st
M  source
?  cache

Aby ustawić właściwość ignorowania, wykonaj

svn propset svn: ignore cache.

gdzie svn:ignorejest nazwa właściwości, którą ustawiasz, cachejest wartością właściwości i .katalog, w którym ustawiasz tę właściwość. Powinien to być katalog nadrzędny cachekatalogu, który potrzebuje tej właściwości.

Aby sprawdzić, jakie właściwości są ustawione:

> svn proplist
Properties on '.':
  svn:ignore

Aby zobaczyć wartość svn:ignore:

> svn propget svn:ignore
cache

Aby usunąć ustawione wcześniej właściwości:

svn propdel svn:ignore

17
Jeden trudny punkt, o którym się potknąłem. Upewnij się, że nie dodajesz końcowego ukośnika dirname. Na przykład, podczas pisania svn propset svn:ignore dirname, jeśli pozwolisz, aby powłoka (bash) wypełniła dla ciebie svn propset svn:ignore dirname/nazwę katalogu , doda to końcowe ukośnik, pozostawiając ci polecenie , które nie spowoduje zignorowania folderu. Przynajmniej takie było moje doświadczenie.
— David Weinraub,

4
Katalog „cache” nadal będzie wymieniony w „svn st”. Czy istnieje sposób na usunięcie go z widoku? (bez usuwania z dysku)
— Tom Brito

131

Ważne, aby wspomnieć:

W wierszu polecenia nie można użyć

svn add *

Spowoduje to również dodanie zignorowanych plików, ponieważ wiersz poleceń rozwija się *i dlatego svn adduważa, że ​​chcesz dodać wszystkie pliki. Dlatego użyj tego zamiast:

svn add --force .

postępuj dokładnie tak, jak powiedział @binco: svn add --force *NIE DZIAŁA . Użyj kropki, a nie gwiazdy.
— manuell,

80

Ponieważ spędziłem trochę czasu próbując sprawić, aby to zadziałało, należy zauważyć, że jeśli pliki już istnieją w SVN, musisz svn deleteje, a następnie edytować svn:ignorewłaściwość.

Wiem, że to wydaje się oczywiste, ale wciąż pojawiały się jak ?na mojej svn statusliście, kiedy myślałem, że po prostu zignorują je lokalnie.


8
Nie zapomnij użyć opcji --keep-local podczas usuwania plików, jeśli chcesz je zignorować, a nie usunąć.
— Dylan Holmes,

71

Aby nieznacznie rozwinąć, jeśli robisz to za pomocą narzędzia wiersza polecenia svn, wpisz:

svn propedit svn:ignore path/to/dir

który otworzy wybrany edytor tekstu, a następnie wpisz „*”, aby zignorować wszystko, co się w nim znajduje, i zapisz + quit - obejmie to sam katalog w svn, ale zignoruje wszystkie znajdujące się w nim pliki, aby zignorować katalog, użyj ścieżka rodzica, a następnie wpisz nazwę katalogu w pliku. Po zapisaniu uruchom aktualizację („svn up”), a następnie sprawdź odpowiednią ścieżkę.


8
Bardzo dobrze, dziękuję. Wszystkie pozostałe odpowiedzi pominęły przypadek zagnieżdżonych katalogów. Tak więc powyższy przykład (działający) wpisujesz następnie w edytorze katalog ignorowany (który jest z założenia jeden poziom poniżej ścieżki / do / katalogu). To jednak nie zadziała: svn propedit svn: ignore. a następnie wpisując path / to / dir / ignored_directory w edytorze. IOW: SVN dopasowuje obiekty o jeden poziom niżej.
— greenoldman,

30

Ustaw svn:ignorewłaściwość w katalogu nadrzędnym:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Spowoduje to zastąpienie dowolnej bieżącej wartości svn:ignore. Możesz edytować wartość za pomocą:

$ svn pe svn:ignore .

Który otworzy twój edytor. Możesz dodać wiele wzorów, po jednym w wierszu.

Możesz zobaczyć bieżącą wartość za pomocą:

$ svn pg svn:ignore .

Jeśli używasz GUI, powinna to zrobić opcja menu.


3
svn ps svn:ignore . 'cachedir'powoduje w cachedir is not under version control. zmiana na svn ps svn:ignore 'cachedir' .pracującą dla mnie
— DiCaprio

21

Dziękujemy za wszystkie powyższe uwagi. Chciałbym tylko podzielić się dodatkowymi informacjami z moich doświadczeń, ignorując pliki.


Gdy foldery są już pod kontrolą wersji

Po svn import i svn co pliki, co zwykle robimy po raz pierwszy.

Cała pamięć podręczna środowiska wykonawczego, foldery załączników będą pod kontrolą wersji. przed svn ps svn: zignoruj musimy usunąć go z repozytorium.

W wersji SVN 1.5 powyżej możemy używać svn del --keep-local your_folder, ale w przypadku wcześniejszej wersji moje rozwiązanie to:

  1. svn eksportuje czystą kopię folderów (bez .svnukrytego folderu)
  2. svn del lokalny i repozytorium,
  3. svn ci
  4. Skopiuj z powrotem foldery
  5. Do svn st i potwierdź, że foldery są oznaczone jako „?”
  6. Teraz możemy wykonać svn ps zgodnie z rozwiązaniami

Kiedy potrzebujemy więcej niż jednego folderu do zignorowania

  • W jednym katalogu mam dwa foldery, które należy ustawić jako svn:ignore
  • Jeśli ustawimy jedną, druga zostanie usunięta.
  • Potem zastanawiamy się, że potrzebujemy svn pe

svn pebędzie musiał edytować plik tekstowy. W razie potrzeby możesz użyć tego polecenia, aby ustawić edytor tekstu za pomocą vi :

export SVN_EDITOR=vi
  1. Za pomocą „o” możesz otworzyć nową linię
  2. Wpisz wszystkie nazwy folderów, które chcesz zignorować
  3. Naciśnij klawisz „esc”, aby wyjść z trybu edycji
  4. Wpisz „: wq”, a następnie naciśnij, Enteraby zapisać i wyjść

Plik wygląda mniej więcej tak:

runtime
cache
attachments
assets

możesz także użyć svn propset svn:ignore -F .ignorethesefiles ., który wykorzysta zawartość pliku. Lubię go trzymać, żebyś wiedział, co jest ignorowane. Edycje wymagają zestawu kontrolnego.
— Gerard ONeill,

20

Najpierw usuń ...

Jeśli twój katalog foojest już pod kontrolą wersji, usuń go najpierw za pomocą:

svn rm --keep-local foo

... następnie zignoruj:

svn propset svn:ignore foo .

12

... a jeśli chcesz zignorować więcej niż jeden katalog (powiedz build/ temp/i *.tmppliki), możesz to zrobić w dwóch krokach (ignorując pierwszy i edytować właściwości ignorowania (zobacz inne odpowiedzi tutaj) lub napisać coś w stylu

svn propset svn:ignore "build
temp
*.tmp" .

w wierszu poleceń.


12

Jeśli używasz konkretnego klienta SVN TortoiseSVN , to po zatwierdzeniu masz opcję kliknięcia prawym przyciskiem myszy pozycji i wybrania „Dodaj do listy ignorowanych”.


9

Polecenie zignorowania wielu pozycji jest nieco trudne i wymaga odwrotnych ukośników.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Polecenie to zignorować coś o nazwie cache, tmp, null, a and_so_onw bieżącym katalogu.


6
I tylko dla wyjaśnienia: odwrotny ukośnik tutaj nie jest cechą svn; jest to po prostu sposób na wprowadzenie wielowierszowego ciągu znaków na powłoce. Możesz także użyć edytora i po prostu napisać wiele wierszy.
— sleske

Odwrotny ukośnik nie jest wymagany do bash. bash jest wystarczająco inteligentny, aby wiedzieć, że „jest otwarty i nie przetwarzać wiersza. Wszystko, co musisz zrobić, to nacisnąć Enter po pamięci podręcznej, tmp i null. Zobaczysz, że bash zmienia znak zachęty na>, abyś wiedział, że jesteś wciąż wpisują polecenie. Alternatywą jest rozpoczęcie wpisywania polecenia (svn), a następnie naciśnij klawisz esc, a następnie v. Pozwoli to wprowadzić polecenie w edytorze. Naciśnij ZZ po zakończeniu, aby wykonać polecenie. jeśli zmienisz zdanie i nie chcę wykonywać, to: q !.
— Michael Potter

1
svn propset svn:ignore -F .ignorethesefiles .pozwoli ci użyć pliku. I jak wspomniano, zawsze miałeś propedit.
— Gerard ONeill,

5

Miałem problemy z ignorowaniem zagnieżdżonych katalogów; górny katalog, który chciałem zignorować, nie wyświetlałby się z „svn status”, ale wszystkie podkatalogi tak. Jest to prawdopodobnie oczywiste dla wszystkich innych, ale pomyślałem, że podzielę się tym:

PRZYKŁAD:

/bagażnik samochodowy

/ trunk / cache

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci

4

"Dziękuję Ci" svn za tak ohydny, fałszywy i trudny sposób ignorowania plików.

Napisałem więc skrypt svn-ignore-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Ponadto, aby zignorować określoną listę plików / ścieżek, możemy użyć tego wariantu svn-ignore . Myślę, że svn-ignore-all powinno naprawdę być jak xargs svn-ignore.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Jeszcze jedno: mam tendencję do zanieczyszczania moich kas svn wieloma losowymi plikami. Kiedy nadchodzi czas zatwierdzenia, przenoszę te pliki do „starego” podkatalogu i mówię svn, aby ignorował „stary”.


Hej Sam, fajny scenariusz. W mojej głowie pojawiło się pytanie: czy może problem polega na tym, że ignorowanie całego folderu będącego częścią repozytorium nie działa, więc otrzymujemy te „?” pliki, które są w zasadzie zmodyfikowanymi plikami w folderach, które dodaliśmy do listy ignorowanych? Zastanawiam się tylko, czy istnieje jakiś sposób obejścia twojego skryptu, ponieważ ciągłe uruchamianie go byłoby uciążliwe. Czy ty?
— SquareCat

nie, tak naprawdę tego nie używam! po prostu spróbuj wyczyścić moje pliki
— Sam Watkins

4

Bash oneliner dla wielu ignoruje:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"

3

Jeśli katalog projektu ma nazwę / Project, a katalog pamięci podręcznej ma nazwę / Project / Cache, musisz ustawić właściwość subversion w / Project. Nazwą właściwości powinna być „svn: ignore”, a wartością właściwości powinna być „pamięć podręczna”.

Więcej informacji na temat właściwości można znaleźć na tej stronie w podręczniku Subversion.


3

Odpowiedź Jasona załatwi sprawę. Jednak zamiast ustawiać svn: ignore na „.” w katalogu pamięci podręcznej możesz dołączyć „pamięć podręczną” do właściwości svn: ignore katalogu nadrzędnego , na wypadek, gdyby katalog pamięci podręcznej nie zawsze był obecny. Robię to w wielu „wyrzucanych” folderach.


3

ABY ZACHOWAĆ KATALOGI, KTÓRE SVN BĘDĄ IGNOROWAĆ:

  1. spowoduje to usunięcie plików z repozytorium, ale katalog pozostanie pod kontrolą SVN:

svn delete --keep-local path / directory_to_keep / *

  1. następnie zignoruj ​​katalog (i całą zawartość):

svn propset svn: ignore "*" path / directory_to_keep


2

Jeśli używasz interfejsu użytkownika dla SVN, takiego jak TortoiseSVN, lub jakiegoś rodzaju integracji IDE, w tym samym menu powinna również znajdować się opcja ignorowania jako operacji zatwierdzania / dodawania.


1

Ustaw svn: ignore własność . Większość narzędzi SVN z interfejsem użytkownika ma na to sposób, a także omówienie wiersza polecenia w łączu.


1

Ponieważ używasz Wersji, jest to naprawdę bardzo łatwe:

  • Przeglądaj wypisaną kopię
  • Kliknij katalog, aby go zignorować
  • W polu „Ignoruj ​​po prawej stronie kliknij Edytuj
  • Wpisz *. *, Aby zignorować wszystkie pliki (lub * .jpg dla samych plików jpg itp.)

1

Uważaj również na końcowe cięcia. Zauważyłem, że uwzględnienie images/*w moim pliku ustawień ignorowania nie ignorowało ./images/. Kiedy prowadziłem svn status -u, nadal się pokazywało ? images. Właśnie zmieniłem ustawienie ignorowania na just images, no slash. Przeprowadziłem kontrolę statusu i to wyjaśniło.


1

Rozwiązane za pomocą Eclipse w następujący sposób:

Przede wszystkim zsynchronizuj folder z projektem:

zespół -> synchronizacja

W następnym widoku, widoku zespołu, możesz zobaczyć wszystkie zasoby, które możesz zatwierdzić na serwerze SVN.

Wybierz folder zasobów zasobu, który chcesz zignorować, a następnie możesz go zignorować za pomocą

zespół -> dodaj do svn:ignore.

Następnie w oknie potwierdzenia wybierz pierwszą opcję: „ignoruj ​​według nazwy”.

Na przykład, jeśli chcę zignorować folder docelowy i jego zasoby klasy. Zsynchronizuję, aw widoku synchronizacji wybiorę folder docelowy. Następnie wybiorę

zespół-> dodaj

do, svn:ignorea następnie potwierdzę pierwszą opcję w oknie potwierdzenia.


0

Po tym, jak straciłem dużo czasu, szukając sposobu na wykonanie tej prostej czynności, postanowiłem napisać, że nie było trudno znaleźć dobre wyjaśnienie.

Najpierw pozwól strukturze próbki

$ svn st? projekt / bagażnik / cel? project / trunk / myfile.x

1 - najpierw skonfiguruj edytor, w eksport mycase vim SVN_EDITOR = vim

2 - „svn propedit svn: ignore project / trunk /” otworzy nowy plik i możesz dodać swoje pliki i podkatalog w naszym przypadku wpisz „cel” zapisz i zamknij plik i działa

$ svn st? project / trunk / myfile.x

dzięki.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.