Jak odrzucić lokalne zmiany w kasie SVN?

Chciałem złożyć diff do recenzji, dla projektu Open Source.

Kod otrzymałem używając SVN (z terminala, Ubuntu). I zrobiłem drobne zmiany w kilku plikach. Teraz jest tylko jedna zmiana, którą chcę zgłosić. Pozostałe zmiany, które wprowadziłem, były do debugowania i nie są już wymagane.

Wygenerowałem diff używając svn di > ~/os/firstdiff.diff

Więc moje pytanie, jak odrzucić moje lokalne zmiany?

Czy jest na to sposób SVN? Jeśli nie, będę musiał przejść do każdego pliku i usuń wszystkie moje edycje. Następnie wygenerowałbym nowy diff i przesłał go.

 159
svn
Author: Vinayak Garg, 2012-02-27

8 answers

Po prostu użyj svn revert polecenie, na przykład:

svn revert some_file.php

Jest to (jak każde inne polecenie svn) dobrze udokumentowane w zasobie svnbook lub na stronie podręcznika, a nawet w Komendzie svn help.

 206
Author: Cédric Julien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-17 18:06:26

Musisz cofnąć wszystkie zmiany używając svn revert komendy:

  • Przywróć zmiany do pliku: svn revert foo.c
  • Przywróć cały katalog plików: svn revert --recursive .
 163
Author: Alberto Spelta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 19:58:46

Aby odrzucić lokalne zmiany w jednym konkretnym pliku:

$ svn revert example_directory/example_file.txt

Aby odrzucić lokalne zmiany w jednym konkretnym folderze:

$ svn revert -R example_directory/
 13
Author: batigolix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 13:47:51

Proste svn revert wystarczyło na oryginalny plakat. Jednak prosty svn revert nie zrobi się w bardziej ogólnym przypadku, gdy ty

  1. mieć zarówno edycje, które chcesz udostępnić, jak i edycje, których nie chcesz udostępnić W tym samym pliku ,
  2. miej lokalne zmiany, które nadal jesteś zainteresowany utrzymaniem dla własnej prywatnej korzyści .

@ErichBSchulz sugestia użycia git add -p jest bardzo rozsądna i znacznie bardziej ogólnie zastosowanie w takim przypadku. W odpowiedzi brakowało tylko szczegółów. Zakładając, że Twój bieżący katalog jest katalogiem, w którym chcesz wprowadzić łatkę sharable, możesz zrobić coś takiego:

  1. Checkout nieskazitelna wersja z subversion do innego katalogu (wybierz nazwę katalogu, który nie istnieje, tutaj używając podkatalogu TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Używając tego nieskazitelnego SVN checkout jako podstawy, init repozytorium git, ignorując .katalogi svn; commit wszystko w svn przechodzi do tymczasowego repozytorium git

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Skopiuj nowo przygotowane metadane repozytorium git do oryginalnego katalogu roboczego; ponieważ nieskazitelny katalog kasy subversion nie jest potrzebny, możesz się go pozbyć. Twój katalog roboczy jest teraz zarówno repozytorium git jak i subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Możesz teraz użyć potężnego i wygodnego git add -p, aby interaktywnie wybrać dokładnie to, co chcesz udostępnić i zatwierdzić je do swojego repozytorium git. Jeśli chcesz dodać pliki do commita, wykonaj również git add <file-to-add> przed git commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Używając commita, przygotuj łatkę, którą chcesz udostępnić. W tym celu możesz również użyć git diff HEAD^..HEAD, lub git format-patch (ten ostatni może być użyty do bezpośredniego przygotowania wiadomości e-mail do wysłania zawierających łatkę lub wiele łatek):

    $ git show -p HEAD > my-mighty-patch.patch
    

Aby pozbyć się metadanych git, po prostu zrób rm -rf .git/. Jeśli planujesz kontynuować hakowanie z oryginalnym katalogiem roboczym, możesz nadal używać git aby zarządzać lokalnymi zmianami. W tym przypadku prawdopodobnie skorzystasz z inwestycji w naukę korzystania z git svn.

Uwaga: jeśli jesteś zaznajomiony z git jest to raczej banalna rzecz do improwizacji. W przeciwnym razie wygląda to trochę niechlujnie. Możesz uogólnić to podejście, pisząc skrypt z tych kroków, aby zaimplementować "interactive commit" lub "interactive patch creation" dla svn, który mógłby być użyty bez żadnego zrozumienia Gita.

 7
Author: FooF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 04:59:05

You could use

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

Publikując swój diff, nie zapomnij podać wersji, wobec której się różnisz.

Jak odpowiedzieli inni, Możesz również używać svn revert ostrożnie. To zależy, czy chcesz zachować lokalne zmiany w swojej przyszłej pracy, czy nie...

 4
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 11:16:30

Przejdź do katalogu głównego tego repozytorium i uruchom następujące polecenie

svn revert --depth=infinity .
 3
Author: Bunty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 16:23:07

Możesz użyć polecenia commit na pliku, który chcesz umieścić, i użyć polecenia SVN revert, aby odrzucić pozostałe zmiany lokalne

 1
Author: jlemos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 10:51:36

Użyj Git!

git add -p

Daje interaktywną możliwość wyboru zmian do zatwierdzenia.

 -17
Author: ErichBSchulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 19:59:46