Wypisanie z SVN ignoruje folder

Odpowiedzi:

104

Nie możesz bezpośrednio ignorować folderów przy pobieraniu, ale możesz użyć rzadkich pobrań w svn 1.5. Na przykład:

$ svn co http://subversion/project/trunk my_checkout --depth immediates

Spowoduje to sprawdzenie plików i katalogów z linii głównej twojego projektu do 'my_checkout', ale nie powtórzy w tych katalogach. Na przykład:

$ cd my_checkout && ls
bar/ baz foo xyzzy/

Następnie, aby pobrać zawartość „bar”:

$ cd bar && svn update --set-depth infinity
Jon Topper
źródło
Uwaga: w niektórych wersjach 1.5 był błąd, który uniemożliwiał to zsvn: Shallowing of working copy depths is not yet supported
gcb
79

Tak, możesz używać SVN 1.6. Najpierw musisz dokonać płatności, a następnie zaznaczyć folder do wykluczenia, a następnie usunąć niechciany folder.

svn checkout http://www.example.com/project
cd project
svn update --set-depth=exclude docs
rm -fr docs

Od teraz żadne aktualizacje kopii roboczej nie będą ponownie wypełniać folderu dokumentów.

Zobacz http://blogs.collab.net/subversion/2009/03/sparse-directories-now-with-exclusion/ i http://subversion.apache.org/docs/release-notes/1.6.html#sparse- wykluczenie katalogu, aby uzyskać więcej informacji.

Tomek

tommy_turrell
źródło
2
Głosowano za mną, ponieważ uchroniło mnie to przed koniecznością wyewidencjonowania ogromnego folderu, który nie był związany z moją pracą.
dohpaz42
1
To świetnie, razem z czyszczeniem svn zaoszczędziło mi to 12 GiB.
JonnyJD
1
Czy to nadal nie wszystko początkowo kasuje?
Huangism
9

W wersjach wcześniejszych niż 1.5 stwierdziłem, że jeśli wyewidencjonujesz tylko najwyższy folder, a następnie wybiórczo zaktualizujesz, od tego momentu aktualizacje będą miały wpływ tylko na to, co wyewidencjonowałeś. To znaczy.

svn co -N foo
cd foo
svn up -N bar
svn up

Flaga -N sprawia, że ​​operacja nie jest rekurencyjna. Powyższe nie spowoduje sprawdzenia niczego innego na poziomie foo, np. powiedzmy, że istnieje folder lala, ostateczne svn up nie sprawdzi tego folderu, ale zostanie zaktualizowane bar.

Ale później możesz svn up lalai tym samym dodać go do kasy.

Przypuszczalnie działa to również z wersją 1.5.

mxcl
źródło
6

To jest w kliencie TortoiseSVN 1.7.1 (może być również dostępne w niektórych starszych wersjach):

  • Zamówienie SVN -> Wybierz URL repozytorium

  • Kliknij "Pozycje do kasy" (pod Głębokość realizacji) i wybierz tylko wymagane foldery!

gammay
źródło
4

Możesz umieścić folder docs w zewnętrznym repozytorium, a następnie użyć svn checkout --ignore-externals.

John Millikin
źródło
Właśnie to zrobiliśmy, aby pominąć niektóre gotowe komponenty w poprzednim zadaniu.
Mark Bessey
2
Nie rozumiem, co to external repositoryznaczy. Możesz to wyjaśnić?
Victor,
4

Tak, Subversion 1.5 ma funkcję o nazwie Sparse checkouts, która może zrobić dokładnie tego rodzaju rzeczy.

Greg Hewgill
źródło
2
Czytając to, wygląda na to, że rzadkie kasy ograniczają tylko głębokość kasy. Nie mogą zignorować jednego konkretnego folderu.
John Millikin,
Jasne, być może będziesz musiał wykonać trochę dodatkowej pracy, na przykład ograniczyć głębokość folderu nadrzędnego za pomocą --depth natychmiast, a następnie sprawdzić wszystkie inne foldery z wyjątkiem tego, który chcesz zignorować. Chodzi o to, że narzędzia są tam, gdzie trzeba ich użyć.
Greg Hewgill,
Doceniam wzmiankę o SparseCheckouts i na pewno jest to interesujące, ale ta odpowiedź nie dotyczy pierwotnego pytania. Jasne, mogę pobierać jeden plik na raz, a to spowoduje, że będę mieć lokalne kopie określonych plików, które chcę, ale co za ból w dupie trzeba robić każdy z osobna. Uważam, że autor tego pytania pyta o zignorowanie określonego folderu, a nie głębokości folderów x, i pozwolenie komputerowi na wykonanie pracy - ta sama praca, którą zalecasz, może być wykonana ręcznie.
barrypicker
Wersje 1.6+ zapewniają dodatkową możliwość ignorowania folderów i większą kontrolę nad tym, co należy uwzględnić / wykluczyć w kopii roboczej (gdzie wersja 1.5
FruitBreak
3

Znalazłem to pytanie, szukając sposobu na sprawdzenie źródeł WebKit z wyłączeniem testów regresji. Skończyło się na tym:

svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit \
  --depth immediates

cd WebKit
find . \
  -maxdepth 1 -type d \
  -not -name '.*' \
  -not -name '*Tests' \
  -not -name 'Examples' \
  -not -name 'Websites' \
  | (while read SUBDIR; do svn update --set-depth infinity "$SUBDIR"; done)

Zauważ, że możesz zmienić wykluczenia według własnego uznania, ale. * Zaleca się pominięcie katalogu roboczego (który jest już aktualny) i wszystkich katalogów .svn.

rgov
źródło
jaki to język?
Pup
są to polecenia powłoki unixowej (można je również zapisać i wykonać jako plik skryptu)
mrlem
2

Niedawno rozwiązałem to samo zadanie. Chodzi o to, aby uzyskać natychmiastową listę folderów / plików w repozytorium, z wyłączeniem potrzebnych wpisów, a następnie sprawdzić pozostałe foldery i zaktualizować najbliższe pliki, jeśli takie istnieją. Oto rozwiązanie:

    # Path to the svn repository to be checked out
rpath=https://svn-repo.company.com/sw/trunk/ && \
    # This files are to be excluded (folders are ending with '/')
    # this is a regex pattern with OR ('|') between enties to be excluded
excludep='docs_folder/tests_folder/|huge_folder/|file1|file2' && \
    # Get list of the files/folders right under the repository path
filtered=`svn ls $rpath | egrep -v $excludep` && \
    # Get list of files out of filtered - they need to be 'uped'
files=`echo $filtered | sed 's| |\n|g' | egrep '^.*[^/]$'` && \
    # Get list of folders out of filtered - they need to be 'coed'
folders=`echo $filtered | sed 's| |\n|g' | egrep '^.*[/]$'` && \
    # Initial nonrecursive checkout of repository - just empty
    # to the current (./) working directory
svn co $rpath ./ --depth empty && \
    # Update the files
svn up $files &&\
    # Check out the all other folders finally.
svn co `echo $folders | sed "s|\<|$rpath|g"`

Przejdź do źródłowego katalogu roboczego. Skopiuj polecenia. Pasta. Zmień odpowiedni adres URL i wyklucz wzorzec. Uruchom polecenie.

Dzięki,

bv.
źródło
1
hej, co to 6 lat dla programistów? W ostatniej linii masz $ ubrpath. Gdzie to jest ustawione?
D-Klotz
1
@ D-Klotz, dziękuję, zamiast tego powinno to być $ rpath, które z kolei jest ustawione na ścieżkę repozytorium. <br/> Przepraszam za rok spóźnienia
bv.
1

Nie, ignorowanie służy tylko do dodawania plików.
Możesz użyć rzadkich kas (jeśli używasz svn 1.5)

Peter Parker
źródło
1

Jak kilku innych wspomniało, możesz po prostu użyć właściwości svn: externals, a następnie opcji --ignore-externals podczas realizacji transakcji. Należy pamiętać jednak, że svn: externals jest nie koniecznie odnosić się do innego repozytorium. Może to być odniesienie do innego folderu w tym samym repozytorium.

Nik Reiman
źródło