2011-02-03 13 views
7

Mam wymóg utworzenia kompilacji na podstawie znacznika lub gałęzi. Dlatego zautomatyzowałem proces kompilacji, aby przejść do znacznika lub gałęzi, gdy pytają o kompilacje. Iam za pomocą polecenia switch svn, aby skopiować kopię roboczą do znacznika lub gałęzi z kopii roboczej łącza. Problem polega na tym, że: Jeśli w wersji głównej są nowo dodane foldery, nie są one usuwane z kopii roboczej. Pozostają one niewersjonowane w kopii roboczej, ale niewersjonowane foldery w kompilacji powodują wiele problemów. Jak uniknąć tego problemu? Czy istnieje opcja uniknięcia niewersjonowanych plików podczas używania polecenia switch svn.Przełącznik SVN nie usuwa folderów/plików w działaniu, które nie są obecne podczas przełączania do znacznika lub gałęzi

Odpowiedz

2

Przełącznik SVN nie usunie niewersjonowanych plików, jak już znalazłeś.

Sposób w jaki postępuję w procesie budowania (Cruise Control) polega na tym, aby zawsze usuwać cały folder roboczy po każdym kompilacji. Następnie, gdy twój proces budowy otrzyma SVN, będzie on w pustym katalogu i nie będzie konfliktów.

BTW dlatego powinieneś używać oddzielnego serwera kompilacji - wtedy nie będziesz mieć niezaakceptowanej pracy programisty, która przeszkadza w kompilacji.

+0

I Myślę, że nie dostałem moich pytań. Head rewizja będzie mieć niektóre foldery lub pliki przeznaczone na repozytorium, podczas gdy z powrotem te foldery zostaną usunięte z kopii roboczej.po przejściu do gałęzi/znacznika kopia robocza jest równa nowej gałęzi lub znacznikowi – sandy

+0

Myślę, że przegapiłeś to, co miałem na myśli .. Jeśli usuniesz wszystkie z katalogu roboczego przed zmianą, to nie ma znaczenia, co tam było wcześniej lub w chwili obecnej w dowolnym innym oddziale/tagu. Będziesz miał tylko kod dla gałęzi, którą chcesz zbudować. –

+0

po usunięciu, czy mogę zrobić przełącznik svn, zamiast tego mogę zrobić svn kasy. ponieważ kopia robocza jest pusta ?, a następnie wats cały punkt posiadania polecenia przełącznika svn. Popraw mnie, jeśli się mylę? – sandy

1

Dwa lata później ...

Po pewnym majstrować wokół i widząc Twoje pytanie (Sandy) odpowiedź brzmi tak, przełącznik należy usunąć katalog. Miałem ten sam problem i wymyśliłem ten jeden.

Żeby było jasne, kwestia jak rozumiem to jest, że dodać katalog/folder do swojej branży, a następnie powrócić do bagażnika. Ten dodany folder powinien zostać usunięty podczas przełączania.

Widziałem, że SVN Tortoise próbował usunąć folder, ale bez błędu i bez faktycznego usuwania folderu. Okazało się, że był problem z uprawnieniami. Po ręcznym usunięciu folderu znajdującego się na Trunkie przełączanie się tam iz powrotem powodowało oczekiwane rezultaty; folder zostanie usunięty.

4

Nie ma błędów, ale przed przełączeniem trzeba się upewnić, że obszar roboczy jest czysty. Jeśli jest czysty, przełączanie usuwa/tworzy pliki i katalogi, które są obecne tylko w jednej wersji. W tym celu podręcznik subversion 1.6 mówi:

"Przełączenie" kopii roboczej, która nie ma lokalnych modyfikacji do innego oddziału, powoduje, że kopia robocza wygląda tak samo, jak gdybyś zrobił nowe zakupy w katalogu.

Właśnie przetestowałem to z nowo utworzonym repozytorium testów. Jeśli z drugiej strony istnieją lokalne modyfikacje w bieżącym obszarze roboczym, svn nie odrzuci ich. svn jest dość konserwatywny pod tym względem. Na przykład. Stworzyłem katalog dir na trunk i zatwierdziłem go. Następnie utworzyłem plik kopii zapasowej dir/file.~1~. To nie było zgłaszane przez svn st ponieważ *~ jest globalnie ignorowane z moim config. Kiedy przeszedłem z powrotem do oddziału svn powinien usunięty dir ale to byłby usunięty plik kopii zapasowej, więc svn nie robić. Zachował katalog jako lokalną modyfikację.

dygresja: po włączeniu powrotem do tułowia svn ponownie zgłosił błąd, ponieważ dir jako lokalnej modyfikacji na oddział był w konflikcie z wersjonowanym dir na pniu. --force rozwiązał ten problem.

+0

Nie przeczytałeś wystarczająco dobrze problemu. "svn add", a następnie "svn switch" do starej wersji powoduje nierejestrowane pliki, ale powinny one zostać usunięte. Przy czystym zakupie "przełącznik svn" pomiędzy różnymi oddziałami i tagami nie powinien powodować konfliktów, ale w rzeczywistości powoduje konflikty. Może powinienem spróbować stworzyć powtarzalny scenariusz ... – tobixen

+0

Testowałem teraz z czystym i pustym repo, stopniowo dodając kilka plików i katalogów i robiąc oznaczenia - ale SVN zrobił to, co trzeba, i usunął nowsze pliki. Dziwne. Jestem pewien, że zaobserwowałem problemy w zeszłym tygodniu, a problemy z pewnością nie wynikały z plików dodanych lokalnie. Będę grał z tym trochę więcej. – tobixen

+0

OK, myślę, że być może coś tu jest. Moje badania tutaj są zbyt długie, aby zmieścić się w komentarzu, więc napiszę osobną odpowiedź. – tobixen

2

Rzeczy działają tak, jak powinny, przynajmniej w svn 1.6.11 i wyższych. Jednak proces kompilacji jest całkiem prawdopodobne, aby pozostawić pliki unrevisioned. Tych może być przezroczysta na „svn status” ze względu na ustawienia SVNIGNORE.Może to powodować problemy, gdy ktoś oczekuje, że svn usunie cały katalog.

Zrobiłem kilka testów - ustawiłem nowe i puste repozytorium, utworzyłem katalogi tułowia i znaczników, dodałem jeden i jeden plik podczas oznaczania go. (poniższe sekcje kodu nie zawierają danych wyjściowych i błędów zgłaszanych przez SVN, zachęcamy do skopiowania go do okna terminala i sprawdzenia, czy można powielić to zachowanie).

mkdir /tmp/workdir/ 
cd /tmp/workdir 
svnadmin create /tmp/foobar 
svn checkout file:///tmp/foobar/ 
svn mkdir foobar/tags 
svn mkdir foobar/trunk 
cd foobar 
svn commit -m "trunk and tags" 
## NOTE: in svn 1.8 and higher, it's needed with a --ignore-ancestry option below 
svn switch file:///tmp/foobar/trunk 

(i tu już widzimy, że robi słusznie - usunięcie znaczników i podkatalogów trunk)

touch file1 
svn add file1 
svn commit -m "added file1" 
svn cp -m "file1 in tag1" . file:///tmp/foobar/tags/tag1 

A potem znowu ...

touch file2 
svn add file2 
svn commit -m "added file2" 
svn cp -m "file2 in tag2" . file:///tmp/foobar/tags/tag2 

Powiedzmy wyraźnie usuń plik1 ze znacznika3

svn rm file1 
svn commit -m "deleted file1" 
svn cp -m "file1 removed from tag3" file:///tmp/foobar/trunk/ file:///tmp/foobar/tags/tag3/ 

... i nowy katalog, jak również ...

svn mkdir dir1 
touch dir1/file3 
svn add dir1/file3 
svn commit -m "added dir1/file3" 
svn cp -m "dir1/file3 in tag4" file:///tmp/foobar/trunk file:///tmp/foobar/tags/tag4/ 

... i niech go usunąć w tag5 ...

svn rm dir1 
svn commit -m "removed dir1/file3" 
svn cp -m "dir1/file3 removed in tag5" file:///tmp/foobar/trunk file:///tmp/foobar/tags/tag5/ 

... i sprawdźmy jak przełączanie utworów. ..

svn switch file:///tmp/foobar/tags/tag1 
svn switch file:///tmp/foobar/tags/tag2 
svn switch file:///tmp/foobar/tags/tag3 
svn switch file:///tmp/foobar/tags/tag4 
svn switch file:///tmp/foobar/tags/tag5 
svn switch file:///tmp/foobar/tags/tag4 

... żadnych problemów. Ale powiedzieć, że zmodyfikowane dir1/plik3 z emacs - to zazwyczaj zrobić kopię zapasową pliku:

touch dir1/file3~ 

nie pokazać się na „svn status” ze względu na ustawieniach domyślnych SVNIGNORE ...

svn status 

ale to wystarczy, aby złamać rzeczy:

svn switch file:///tmp/foobar/tags/tag5 
svn status 
svn switch file:///tmp/foobar/tags/tag4 

pierwsze polecenie wskazuje, że dir1 zostanie usunięty, ale ze względu na pliku unrevisioned katalog dostaje stojąco.

"svn przywrócić" niestety nie usuwa unrevisioned plików ...

svn revert -R . 
svn switch file:///tmp/foobar/tags/tag5 
svn status 
svn switch file:///tmp/foobar/tags/tag4 

"make clean" może i może nie działać, w zależności od środowiska. Można oczywiście zrobić skrypt, aby go usunąć, to znaczy tak:

rm -rf $(svn status --no-ignore | grep -E '^\?' | awk ' { print $2 ; }') 
svn switch file:///tmp/foobar/tags/tag4 

Należy pamiętać, że powyższe polecenie może robić złe rzeczy, kiedy napotykają nazwy plików ze spacjami.

One mogą uniknąć niektórych komunikatów o błędach powyżej za pomocą „force”:

touch dir1/file3~ 
svn switch --force file:///tmp/foobar/tags/tag5 
svn switch --force file:///tmp/foobar/tags/tag4 

Zauważ, że mydir1/plik3 ~ nigdy nie zostanie usunięty, ale że ostatni przełącznik nie zawiedzie

Powiązane problemy