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ń.

Gilean
źródło
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 .
Jason Cohen
źródło
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
Craigb
źródło
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 .
binco
źródło
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.

Kai
źródło
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ę.

Greg
źródło
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.

Frank Szczerba
źródło
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
Elliot Yap
źródło
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 .
matowe oparzenia
źródło
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ń.

DerMike
źródło
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”.

Michael Lang
źródło
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.

James Stroud
źródło
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
mózg
źródło
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”.

Sam Watkins
źródło
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"
Fedir RYKHTIK
źródło
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.

The Digital Gabeg
źródło
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.

harpo
źródło
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

sheasie
źródło
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.

Chris Marasti-Georg
źródło
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.

Joe Skora
źródło
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.)
Andrzej
źródło
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.

cdmo
źródł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.

Antonio Martin
źródło
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.

Bruno Lee
źródło