Jak usunąć plik z kontroli wersji bez usuwania go?

Odpowiedzi:

280

Chcesz opcji --keep-localwiersza poleceń. Spowoduje to usunięcie pliku z kontroli wersji bez usuwania go z systemu plików.

$ svn rm --keep-local my_important_file

Uwaga:--keep-local tylko wpływa na svn rmswojej kopii. Inni użytkownicy mogą mieć swoją własną lokalną kopię pliku usuniętą, chyba że istnieje konflikt między ich lokalną kopią a repozytorium z powodu wprowadzonych przez nich zmian. To może nie być pożądany rezultat. Zobacz komentarze poniżej.

Andres Jaan Tack
źródło
4
Czy nie spowoduje to usunięcia go z systemów innych osób po aktualizacji?
Nyerguds
1
@Nyerguds Zgadza się, ponieważ svn rm usuwa pliki z repozytorium. Jeśli chcesz usunąć pliki z repozytorium, ALE zachowaj je lokalnie na swoim komputerze, a następnie użyj powyższej flagi.
Greg Hilston,
6
@GregHilston Jak powiedziałem, to jednak nie pomaga w rzeczywistych projektach z wieloma programistami. Powinien istnieć sposób na cofnięcie wersji pliku wszędzie. Najczęstszym przypadkiem jest tutaj przypadkowe zatwierdzenie lokalnych plików ustawień (bardzo powszechne w projektach Java), ale cofnięcie ich wersji nie powinno wyczyścić plików ustawień innych użytkowników.
Nyerguds
5
@GregHilston „rzeczywiste projekty wielu programistów” były raczej implikowane w „systemach innych ludzi”. Problem jest następujący: inne osoby aktualizują i otrzymują nadpisanie swoich ustawień. Zwykle nie jest to zbyt problematyczne, ale wystarczająco denerwujące, aby chcieć go rozwiązać. Ale w tym momencie, kiedy już nadpisali ustawienia i teraz otrzymają svn „rm” podczas aktualizacji, faktycznie usuwa potencjalnie istotny plik ustawień lokalnych z ich systemu, podczas gdy powinien być po prostu pozbawiony wersji, aby można go było skonfigurować jako lokalny ponownie ustawienia.
Nyerguds
4
Ponowne załadowanie starszego pliku z repozytorium oznacza, że ​​pochodzi on ze starszej wersji, co oznacza, że ​​aktualizacja po prostu usunie go ponownie. Nie ma na to czystego sposobu, który nie wymaga ręcznej interwencji na wszystkich maszynach w projekcie.
Nyerguds
13

Usunięcie pliku z SVN bez usuwania go lokalnie nigdzie nie jest częstym problemem. Jednym z wybitnych przykładów jest plik .classpath w projekcie Eclipse. Umieszczenie tego pliku konfiguracyjnego w SVN jest cudowne, o ile wszystkie maszyny używane w projekcie mają tę samą instalację Eclipse i Java. Gdy ten warunek zostanie naruszony, zatwierdzenia zaczynają przerywać inne projekty Eclipse. To jest punkt, w którym należy usunąć plik z SVN bez usuwania go w dowolnym miejscu.

svn rm --keep-local .classpath

wykonuje pracę doskonale na jednej maszynie iw tym momencie.

Problem polega na tym, że inne maszyny mogą utracić ten plik (podczas aktualizacji) lub wskrzesić go (po zatwierdzeniu). Wada SVN nie polega na tym, że nie radzi sobie --keep-localw repozytorium ani nie przenosi go na inne kopie robocze. Stąd na wszystkich innych maszynach powyższe polecenie musi zostać wykonane - najlepiej przed jakimkolwiek zatwierdzeniem lub aktualizacją.

To oczywiście zadziała w najlepszym przypadku w 90%. Usuwanie i zmiana wersji nastąpi nagle. Moim rozwiązaniem jest, aby każda maszyna, do której mam bezpośredni lub pośredni dostęp, działała

svn rm --keep-local .classpath
copy .classpath .classpath-nameOfTheMachine
svn add .classpath-nameOfTheMachine

To jest tak po prostu brzydkie, że trudno go nazwać „rozwiązaniem”. Niemniej jednak zawsze pozwalał na szybką naprawę późniejszych wypadków.

Albrecht Weinert
źródło
-3

Nie mam odpowiedzi na to dokładne pytanie, ale mam odpowiedź na pytanie pokrewne, jak usunąć wszystkie pliki (tj. Nie jeden konkretny) w katalogu z kontroli wersji bez usuwania ich lokalnie. To rozwiązanie pochodzi z implementacji Scientific Linux.

ls -a .svn

powinien pokazać katalog svn, który przechowuje dane kontrolne. Po prostu:

rm -r .svn

pozbywa się tego katalogu. Następnie wpisując:

svn status

wyświetli błąd „ostrzeżenie: ten katalog nie jest kopią roboczą”, ponieważ nie podlega już kontroli wersji.

Mam nadzieję, że to pomoże.

cjames
źródło
Powiązane pytanie? Usunięcie pliku i usunięcie całej kopii roboczej to zupełnie inna sprawa IMHO.
Melebius