2008-10-09 8 views
25

Mam następujący problem przy użyciu subversion:Subversion nie łączy zmian do plików o zmienionej nazwie?

Obecnie pracuję nad pnia mojego projektu i planuję dokonać refaktoryzacji (która obejmuje zmianę nazwy plików lub przenoszenie plików do różnych katalogów).

W tym samym czasie ktoś inny pracuje nad tym samym projektem w oddziale.

W pewnym momencie chcę scalić zmiany dokonane na gałęzi z powrotem do bagażnika. Obejmuje to zmiany wprowadzone w plikach (w oddziale), które zostały przemianowane na pniu.

Zrobiłem kilka testów i wydaje mi się, że albo subwersja nie jest w stanie śledzić tych zmian, albo czegoś mi brakuje (na to mam nadzieję). Przetestowałem to za pomocą następującego skryptu (powinien działać w bash, zakłada repozytorium SVN w „http://myserver/svn/sandbox”):

svn co http://myserver/svn/sandbox 

cd sandbox/ 

mkdir -p MyProject/trunk MyProject/branches MyProject/tags 

cat - <<EOF >MyProject/trunk/FileOne.txt 
Test 
1 
2 
EOF 

svn add MyProject 

svn commit -m "init" 

# create a branch 
svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 

# rename the file 
svn move MyProject/trunk/FileOne.txt MyProject/trunk/FileTwo.txt 

svn commit -m "renamed file" 

svn update 

# change the content of FileOne in branch 

cat - <<EOF >MyProject/branches/Branch_1/FileOne.txt 
Test 
2 
3 
EOF 

svn commit -m "changed branch" 

# I now try to merge the changes in FileOne back to FileTwo 
cd MyProject/trunk/ 
svn merge -r1:HEAD http://myserver/svn/sandbox/MyProject/branches/Branch_1 
# but this yields the following message: 
# Skipped missing target: 'FileOne.txt' 

Każda pomoc jest mile widziana.

Edit: Być może proces sugeruje mikegrb mogła nieco przez zautomatyzowane najpierw generowania mapę przemianowany plików (stare-> nowe) z polecenia svn log na pniu:

svn log -v 
------------------------------------------------------------------------ 
r33 | sme | 2008-10-09 15:17:54 +0200 (Do, 09 Okt 2008) | 1 line 
Changed paths: 
    D /MyProject/trunk/FileOne.txt 
    A /MyProject/trunk/FileTwo.txt (from /MyProject/trunk/FileOne.txt:31) 


resulting map: {FileOne.txt => FileTwo.txt} 

teraz wykorzystać tę map, aby zmienić nazwy plików w pliku łaty wygenerowanym w oddziale.

oryginalny:

Index: FileOne.txt 
=================================================================== 
--- FileOne.txt (.../trunk)  (revision 31) 
+++ FileOne.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

modyfikowany:

Index: FileTwo.txt 
=================================================================== 
--- FileTwo.txt (.../trunk)  (revision 31) 
+++ FileTwo.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

tylko pomysł, nie zrobili tego jeszcze.

Odpowiedz

22

Myślę, że to istniejąca Subversion bug - ale nie wstrzymaj oddech, jego otwarty od 2002 roku

+2

Wygląda na to, że wysłali ten błąd do wersji 1.8. To tylko inny sposób powiedzenia "jeszcze nie". Ponieważ jest on otwarty od 2002 roku, zaczyna coraz bardziej przypominać "nigdy". –

+1

@deft_code Czy ten błąd został naprawiony? Myślę, że teraz mogę doświadczyć czegoś podobnego. Zmieniłem nazwę kilku plików za pomocą zmiany nazwy funkcji tortoisesvns, a teraz, gdy próbuję połączyć się z pnia do mojej gałęzi (aby sprawdzić, czy jego kompilacja przed ponowną integracją do pnia) mówi "pominięty brakujący cel" – TravisG

+0

@TravisG - błąd odnosi się do możliwe jest ustalenie w 1.8, które mogły pojawić się w tym tygodniu (było wydanie git, nie jestem pewien wersji). Wciąż jestem na 1.7 ... o jakiej wersji jesteś? –

1

Prawdopodobnie będziesz musiał zmienić ich nazwę w oddziale. Czy możesz scalić wersję, która zmieniła nazwę z pnia na gałąź? To może zaoszczędzić trochę czasu. W przeciwnym razie będziesz musiał zmienić ich nazwę w oddziale. Następnie spróbuj scalić z powrotem do bagażnika.

11

Niestety, jest to jedno z ograniczeń działalności wywrotowej. Kiedy ostatnio mieliśmy podobną sytuację, aby poradzić sobie z naszym rozwiązaniem, stworzyliśmy gigantyczną różnicę dla gałęzi, a następnie przeszukaliśmy plik ręcznie, ręcznie korygując bagażnik. Pliki, których nazwy zostały zmienione i nie zostaną znalezione, powodują, że łatka monituje o zmianę nazwy pliku. Bardzo suboptymalne. Uważaj na pliki binarne, które nie będą wyświetlane w pliku różnic. Był to jeden z głównych czynników, który skłonił nas do oceny innych systemów kontroli wersji i ostatecznie zdecydowaliśmy się przejść na git.

+4

technicznie Git nie ma również obsługi prawdziwych zmian nazwy. Oni jednak wykonują zgadywanie, które jest lepsze niż SVN. Bazar jest jedynym otwartym VCS, który obsługuje prawdziwe nazwy. –

1

Rozwiązaniem jest zsynchronizować gałęzi z pnia przed synchronizacją bagażnik z branży.

Różnica polega na tym, że łącze do gałęzi ma plik, do którego można zastosować zmiany (przenieść), podczas gdy gałąź od strony głównej nie ma pliku do zastosowania zmian (modyfikacji). Jest tak po prostu dlatego, że SVN nie wydaje się śledzić, gdzie pliki są przenoszone/zmieniana nazwa. Nie wiem, dlaczego tak nie jest, mam nadzieję, że jest ku temu dobry powód.

przykład:

  • Ap 1 /trunk/foo.txt przeniesiono do /trunk/folder/foo.txt
  • rev 2: /branches/mybranch/foo.txt modyfikacji

Jak scalić zmiany foo.txt w trunk?

Rozwiązanie:

  1. scalić wszystkie zmiany z tułowia do mybranch i popełnić. Spowoduje to przesunięcie pliku foo.txt.
  2. Scal wszystkie wersje z mybrancha do pnia. Spowoduje to aktualizację zawartości pliku foo.txt, ponieważ mają teraz tę samą ścieżkę.

Uwaga: Jeśli zmieniłeś/zmieniłeś nazwę różnych plików na obu liniach głównych i mybranch, będziesz mógł jeździć. Sądzę, że będziesz musiał selektywnie scalać zmiany, tak abyś robił/zmieniał nazwy w obu kierunkach, a następnie scalał zmiany.

Powiązane problemy