Jak odrzucić lokalne zmiany w kasie SVN?

197

Chciałem przesłać różnicę do recenzji dla projektu Open Source.

Mam kod przy użyciu SVN (z terminala, Ubuntu). I dokonałem drobnych zmian w kilku plikach. Teraz jest tylko jedna zmiana, którą chcę zgłosić. Pozostałe zmiany, które wprowadziłem, dotyczyły 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 istnieje na to sposób SVN? Jeśli nie, będę musiał przejść do każdego pliku i usunąć wszystkie moje zmiany. Następnie wygenerowałbym nowy plik różnicowy i przesłał go.

Vinayak Garg
źródło

Odpowiedzi:

253

Wystarczy użyć svn revertpolecenia, na przykład:

svn revert some_file.php

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

Cédric Julien
źródło
2
Tyle że Vinayak może chcieć zachować dla siebie swoje lokalne nieciekawe zmiany.
Basile Starynkevitch
2
@BasileStarynkevitch: Przeczytałem pytanie ponownie i wygląda na to, że inne zmiany nie są wymagane: „” „Pozostałe zmiany, które wprowadziłem, były w zasadzie do debugowania i nie są już wymagane.” „” :)
Cédric Julien
1
Tak ... ale mógł chcieć zatrzymać je dla siebie ... (Jego pytanie można zrozumieć na dwa sposoby).
Basile Starynkevitch
193

Musisz cofnąć wszystkie zmiany za pomocą polecenia svn revert :

  • Cofnij zmiany do pliku: svn revert foo.c
  • Cofnij cały katalog plików: svn revert --recursive .
Alberto Spelta
źródło
1
odniesienie do svn 1.1 jest trochę stare, mimo że jest to pierwszy link podany przez google ;)
Cédric Julien
najwyraźniej niektóre znaki w nazwie pliku można zignorować. na przykład [email protected]. svn revert [email protected]. svn mówi Pominięte „Ikona”.
topwik
1
To najlepsza odpowiedź. Należy to sprawdzić.
rickfoosusa,
12
svn revert --recursive .Pomaga mi dużo .
Paul Vargas
To powinna być zaakceptowana odpowiedź, ponieważ --recursiveparametr odwraca wszelkie lokalne zmiany i to jest pytanie.
arueckauer
15

Aby odrzucić zmiany lokalne w jednym określonym pliku:

$ svn revert example_directory/example_file.txt

Aby odrzucić zmiany lokalne w jednym określonym folderze:

$ svn revert -R example_directory/
batigolix
źródło
7

Proste svn revertbyło wystarczające dla oryginalnego plakatu. Jednak proste svn revertnie zrobi tego w bardziej ogólnym przypadku

  1. zawierają zarówno edycje, które chcesz udostępnić, jak i edycje, których nie chcesz udostępniać w tym samym pliku ,
  2. wprowadzać lokalne zmiany, które nadal chcesz zachować dla własnej korzyści .

Sugestia @ ErichBSchulza dotycząca zastosowania git add -pjest bardzo rozsądna i w takim przypadku ma znacznie bardziej ogólne zastosowanie. W odpowiedzi brakowało tylko niektórych szczegółów. Zakładając, że bieżącym katalogiem jest katalog, w którym chcesz utworzyć łatkę do udostępnienia, możesz zrobić coś takiego:

  1. Pobierz dziewiczą wersję z subversion do innego katalogu (wybierz nazwę katalogu, która nie istnieje, tutaj używając podkatalogu TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Wykorzystując tę ​​nieskazitelną kasę svn jako podstawę, uruchom repozytorium git, ignorując katalogi .svn; zatwierdzić wszystko w svn head 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ż dziewiczy katalog kasowania 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. Teraz możesz użyć potężnego i wygodnego, git add -paby interaktywnie wybrać dokładnie to, co chcesz udostępnić, i zatwierdzić je w swoim repozytorium git. Jeśli chcesz dodać pliki do zatwierdzenia, zrób to również git add <file-to-add>wcześniejgit 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. Za pomocą zatwierdzenia przygotuj łatkę, którą chcesz udostępnić. W tym celu można również użyć git diff HEAD^..HEADlub git format-patch(tego ostatniego można użyć do bezpośredniego przygotowania wiadomości e-mail, które zostaną wysłane z poprawką lub wieloma łatami):

    $ 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 przy użyciu oryginalnego katalogu roboczego, możesz nadal używać gitdo zarządzania lokalnymi zmianami. W takim przypadku prawdopodobnie skorzystasz z inwestycji w naukę obsługi git svn.

Uwaga: jeśli znasz się na gittym, improwizowanie jest raczej banalne. W przeciwnym razie wygląda to nieco niechlujnie. Możesz uogólnić to podejście, pisząc skrypt z tych kroków, aby zaimplementować „interaktywne zatwierdzenie” lub „interaktywne tworzenie łatek” dla svn, którego można użyć bez znajomości git.

FooF
źródło
3
Dziękuję bardzo za anonimowe -1 bez żadnych wyjaśnień. W każdym razie poprawiłem odpowiedź, wyjaśniając, kiedy to podejście ma sens.
FooF
2
Bardzo dziękuję za rozszerzenie. +1 ode mnie! Nie martw się Trudny tłum.
ErichBSchulz
1
Dzięki za kciuki w górę, @ErichBSchulz! Powoli robimy świat lepszym miejscem do życia pomimo przeciwników !!! ;-)
FooF
4

Możesz użyć

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

Publikując swój plik różnicowy, nie zapomnij powiedzieć wersji, z którą się różnisz.

Gdy inni odpowiedzieli, możesz również używać svn revertostrożnie. To zależy, czy chcesz zachować lokalne zmiany do przyszłej pracy, czy nie ...

Basile Starynkevitch
źródło
+1 To najlepsze rozwiązanie problemu, ale w tym przypadku naprawdę chciałem pozbyć się wszystkich moich zmian. Oczywiście nie chciałbym revertciągle wprowadzać zmian. Więc skorzystam z twojej drogi w przyszłości.
Vinayak Garg
3

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

svn revert --depth=infinity .
Bunty
źródło
1
svn revert -R .może być krótszy
jesjimher
1

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

jlemos
źródło