Częściowe zatwierdzenie z Subversion

104

Biorąc pod uwagę przypadek, dokonałem dwóch niezależnych zmian w jednym pliku: np. dodał nową metodę i zmienił inną metodę.

Często nie chcę zatwierdzać obu zmian jako jednego zatwierdzenia, ale jako dwóch niezależnych zatwierdzeń.

Na repozytorium git Chciałbym użyć trybu interaktywnego z git-add (1) , aby podzielić porcję na mniejsze:

 git add --patch

Jaki jest najłatwiejszy sposób na zrobienie tego z Subversion? (Może nawet przy użyciu wtyczki Eclipse)

Aktualizacja:
W The Thing About Git Ryan nazywa to: „Problem splątanej kopii roboczej”.

Benedikt Waldvogel
źródło
Czy szukałeś konkretnego rozwiązania w wierszu poleceń? Wiele z poniższych odpowiedzi wspomina o „przywracaniu po zatwierdzeniu” TortoiseSVN, który jest funkcją dostępną tylko dla Tortoise - a więc opartą na GUI i Windows.
florisla

Odpowiedzi:

35

Dzięki git-svn możesz utworzyć lokalne repozytorium GIT dla zdalnego repozytorium SVN, pracować z nim przy użyciu pełnego zestawu funkcji GIT (w tym częściowych zatwierdzeń), a następnie przesłać wszystko z powrotem do repozytorium SVN.

git-svn (1)

jkramer
źródło
25
Jest w tym rozwiązaniu szczególna ironia.
tuxayo
65

Tortoise SVN 1.8 obsługuje to teraz dzięki funkcji „Przywróć po zatwierdzeniu”. Pozwala to na edycję pliku, przy czym wszystkie zmiany są cofane po zatwierdzeniu

Zgodnie z dokumentacją:

Aby zatwierdzić tylko te części pliku, które dotyczą jednego konkretnego problemu:

  1. w oknie dialogowym zatwierdzenia kliknij plik prawym przyciskiem myszy, wybierz „przywróć po zatwierdzeniu”
  2. edytuj plik np. w TortoiseMerge: cofnij zmiany, których nie chcesz jeszcze zatwierdzać
  3. Zapisz plik
  4. zatwierdzić plik
Casebash
źródło
Zastanawiam się, jak to działa. Sprawdziłem informacje o wydaniu SVN 1.8 , ale nie mogę dowiedzieć się, na której funkcji „Przywróć po zatwierdzeniu” jest oparta.
DavidS
3
@DavidS To nie jest funkcja SVN. To funkcja TortoiseSVN.
florisla
FYI, SVN 1.8 jest EOL od kwietnia 2018 z wydaniem 1.10
Greg K
Możemy go również znaleźć w dokumentacji tutaj: tortoisesvn.net/docs/release/TortoiseSVN_en/…
Guillaume Husta
42

Zrobiłem to za pomocą TortoiseSVN .

Wbudowane narzędzie scalające pozwala pokazać różnice między wersją repozytorium a kopią roboczą.

Użyj funkcji tworzenia kopii zapasowej narzędzia diff

  1. Przejdź do zatwierdzenia pliku tak, jakbyś zamierzał zatwierdzić wszystkie swoje zmiany.
  2. W oknie zatwierdzenia kliknij dwukrotnie plik, aby wyświetlić różnicę.
  3. W ustawieniach porównania kliknij opcję tworzenia kopii zapasowej oryginalnego pliku .
  4. Kliknij prawym przyciskiem myszy zmiany, których nie chcesz, i użyj polecenia wybierz, użyj innego bloku tekstu .
  5. Zapisz różnicę dokładnie raz . Kopia zapasowa zostanie nadpisana za każdym razem, gdy będziesz zapisywać. Dlatego chcesz zapisać tylko raz.
  6. Zatwierdź zmianę.
  7. Zastąp oryginał utworzonym plikiem .bak (który będzie zawierał wszystkie oryginalne zmiany).
  8. Zatwierdź swój plik.

Powinieneś teraz zatwierdzić wszystkie swoje zmiany, używając dwóch oddzielnych zatwierdzeń.

Kolec
źródło
1
Jak dokładnie to zrobiłeś? Chciałbym nauczyć się tej techniki.
Lasse V. Karlsen,
Byłoby fajnie, gdyby to automatycznie nadpisywało pliki .bak po zatwierdzeniu.
BCS
Nie znalazłem opcji Step-3: Backup, używając Tortoise SVN 1.8.1
sudhAnsu63
4
Nieważne. Znalazłem odpowiedni link do 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html Aby zatwierdzić tylko te części pliku, które odnoszą się do jednego konkretnego problemu: w oknie dialogowym zatwierdzenia kliknij prawym przyciskiem myszy plik, wybierz "przywróć po zatwierdzeniu" edytuj plik na przykład TortoiseMerge: cofnij zmiany, których nie chcesz zatwierdzić, ale zapisz plik zatwierdź plik
sudhAnsu63
Niestety, nie wygląda to na dostępne w Tortoise w wersji 1.8.5, ani nie jest „przywracane po zatwierdzeniu”.
kajaco
24

Spróbuj użyć, svn diff > out.patcha następnie skopiuj out.patchplik do out.patch.addiout.patch.modify

Tylko wtedy, gdy masz działający plik poprawki, przywróć oryginalny plik za pomocą svn revert out.c.

Ręcznie edytuj pliki łat, tak aby zawierały tylko porcje do dodania lub modyfikacji. Zastosuj je do oryginalnego pliku za pomocą patchpolecenia, sprawdź, czy dodatek zadziałał, a następnie svn commitdodatek.

Powtórz płukanie w przypadku out.patch.modifyplastra.

Jeśli zmiany są oddzielne w pliku, jak zadałeś początkowe pytanie - dodałeś nową metodę, zmieniłeś istniejącą metodę - to zadziała

To bardzo żmudne rozwiązanie - chociaż nie jestem przekonany, że powinieneś mieć jakikolwiek powód, aby oddzielać zatwierdzenia.

Mogłeś również pobrać wiele kopii roboczych tego samego źródła, aby zastosować swoją pracę do:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Upewnij się svn upi przetestuj, aby upewnić się, że wszystko jest w porządku.

Chris
źródło
11

Jest to możliwe przy użyciu TortoiseSvn (Windows) od wersji 1.8.

4.4.1. Okno dialogowe zatwierdzenia

Jeśli Twoja kopia robocza jest aktualna i nie ma konfliktów, możesz zatwierdzić zmiany. Wybierz dowolny plik i / lub foldery, które chcesz zatwierdzić, a następnie TortoiseSVN → Zatwierdź ....

<snip>

4.4.3. Zatwierdź tylko części plików

Czasami chcesz zatwierdzić tylko część zmian, które wprowadziłeś w pliku. Taka sytuacja zwykle ma miejsce, gdy pracujesz nad czymś, ale wtedy musi zostać zatwierdzona pilna poprawka, a ta poprawka znajduje się w tym samym pliku, nad którym pracujesz.

kliknij plik prawym przyciskiem myszy i użyj Menu kontekstowe → Przywróć po zatwierdzeniu. Spowoduje to utworzenie kopii pliku w obecnej postaci. Następnie możesz edytować plik, np. W TortoiseMerge i cofnąć wszystkie zmiany, których nie chcesz zatwierdzać. Po zapisaniu tych zmian możesz zatwierdzić plik.

Po zatwierdzeniu kopia pliku jest przywracana automatycznie i masz plik ze wszystkimi modyfikacjami, które nie zostały ponownie zatwierdzone.

W Linuksie spróbowałbym http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php . Jednak sam tego nie wypróbowałem.

parvus
źródło
8

Robiłem to:

  • W moim edytorze (używam vim) edytuj plik tak, aby pojawiła się tylko jedna ze zmian
  • Zapisz plik (ale nie wychodź z edytora)
  • Zatwierdź zmieniony plik na svn
  • Naciśnij „Cofnij” w edytorze wystarczająco dużo razy, aby ponownie pojawił się drugi zestaw zmian
  • Zapisz plik ponownie
  • Zatwierdź drugi zestaw zmian.

Jest to uproszczone podejście, które zakłada, że ​​jeden zestaw zmian można dość łatwo cofnąć. W bardziej złożonych sytuacjach zrezygnowałbym i wprowadził obie zmiany bez martwienia się o to.

Teraz, gdy używam git, mam nadzieję, że już nigdy nie będę tego musiał robić!

Greg Hewgill
źródło
4

Używam lokalnego repozytorium Darcs lub po prostu wprowadzam zmiany stopniowo. Z scalaniem (opendiff otwiera FileMerge, program scalający dostarczany z Xcode; zastąp swoim ulubionym narzędziem do scalania):

cp file file.new
svn revert file
opendiff file.new file -merge file

scalić powiązane zmiany, zapisać scalenie, wyjść z programu scalającego

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

jeśli więcej niż jeden niepowiązany kawałek w pliku, przepłucz i powtórz (ale dlaczego miałbyś czekać tak długo przed zatwierdzeniem ?!)

Ponadto, jeśli znasz git, możesz użyć git-svn do utrzymywania lokalnego repozytorium git i synchronizowania zatwierdzeń z głównym serwerem svn; działa świetnie w moim ograniczonym doświadczeniu.

Eon
źródło
9
Odp .: "Po co czekać tak długo?" Robisz duży refaktor przez cały dzień, a szef rzuca mały błąd naprawiaj to teraz tuż przed lunchem.
BCS
4

Wypróbuj VisualSVN dla programu Visual Studio . Najnowszy 6.1 release wprowadza funkcję QuickCommit. Możesz częściowo zatwierdzić wybrane zmiany w pliku za pomocą nowych poleceń menu kontekstowego Zatwierdź ten blok i Zatwierdź wybór w edytorze programu Visual Studio.

wprowadź opis obrazu tutaj

bahrep
źródło
2
  1. Otwórz wszystkie pliki, które chcesz podzielić, w wybranym edytorze
  2. Używając innego zestawu narzędzi (w Win, skorzystaj z sugestii Spike'a (stara wersja)) wycofaj drugi zestaw
  3. Popełnić
  4. Wróć do wybranego edytora i zapisz wszystkie pliki

Jest to trochę bardziej ryzykowne niż pełna sugestia Spike'a, ale może być łatwiejsze do zrobienia. Upewnij się również, że najpierw wypróbujesz coś innego, ponieważ niektórzy redaktorzy odmówią zapisania na pliku, który zmienił się spod nich, chyba że ponownie załadujesz ten plik (tracąc wszystkie zmiany)

BCS
źródło
0

Myślę, że łatwiejszą opcją niż generowanie plików różnicowych, przywracanie itp. Byłoby wypisanie dwóch kopii repozytorium i użycie narzędzia wizualnego porównywania, takiego jak DeltaWalker, do kopiowania porcji z jednego do drugiego.

Pierwsza kopia byłaby tą, na której faktycznie pracujesz, a druga byłaby właśnie w tym celu. Gdy wprowadzisz mnóstwo zmian w pierwszej, możesz skopiować jedną sekcję do drugiej, zatwierdzić ją, skopiować inną sekcję, zatwierdzić itd.

Ian Dunn
źródło
0
  1. Skopiuj wszystkie zmodyfikowane pliki do kopii zapasowych.
  2. Utwórz poprawkę stanu roboczego za pomocą svn diff.
  3. Przywróć pliki za pomocą svn revert.
  4. Ponownie zastosuj części łatki, które chcesz zatwierdzić, albo używając patchnarzędzia, albo ręcznie edytując, lub cokolwiek innego.
  5. Uruchom diffpóźniej, aby porównać kopię roboczą z kopią zapasową, aby upewnić się, że poprawnie zastosowałeś części poprawki.
  6. Buduj i testuj.
  7. Popełnić.
  8. Skopiuj kopie zapasowe z powrotem do wyewidencjonowania repozytorium.
  9. Powtórz co 2 (nie 1!) Aż do zakończenia.
michaeljt
źródło