Podczas programowania oprogramowania przechowywanego w repozytorium Subversion często modyfikuję niektóre pliki, a następnie zauważam, że chciałbym dokonać pewnych zmian przygotowawczych do mojej głównej pracy. Np. Podczas wdrażania nowej funkcjonalności zauważam pewne refaktoryzacje, które mogą mi pomóc.
Aby nie mieszać dwóch niepowiązanych zmian, w tych przypadkach chciałbym „ukryć” moje zmiany, tj. Przywrócić wersję repozytorium, wprowadzić inne zmiany, zatwierdzić je, a następnie „przywrócić” moje zmiany.
git-stash pozwala to zrobić. Czy można to zrobić za pomocą Subversion, bezpośrednio lub za pomocą wtyczki lub skryptu. Wtyczki Eclipse również byłyby w porządku.
svn
versioning
Śleske
źródło
źródło
Odpowiedzi:
Kiedy mam nieprzypisane zmiany z jednego zadania w mojej kopii roboczej i muszę przejść do innego zadania, robię jedną z dwóch rzeczy:
Sprawdź nową kopię roboczą dla drugiego zadania.
lub
Załóż oddział:
Mam kilka skryptów, które pomagają to zautomatyzować.
źródło
project\temp\<creationdate-reason>
lubproject\personal\<creationdate-reason>
w tym celu.Ten post na blogu zaleca używanie diff i łatki.
git stash
w przybliżeniu staje sięsvn diff > patch_name.patch; svn revert -R .
git stash apply
staje siępatch -p0 < patch_name.patch
Zauważ, że to nie ukrywa zmian metadanych lub (chyba) katalog tworzy / usuwa. (Tak, svn śledzi je osobno od zawartości katalogu, w przeciwieństwie do git.)
źródło
svn patch patch_name.patch
zamiastpatch -p0
, możesz mniej więcej śledzić metadane , ponieważ znajdują się one w pliku łaty, a łatka svn je rozumie.Możesz zapisać bieżące zmiany
svn diff
w pliku łatki, a następnie przywrócić kopię roboczą:Po zaimplementowaniu funkcji przygotowawczej możesz następnie zastosować łatkę za pomocą narzędzia do łatania:
Jak zauważyli inni, nie będzie to działać
svn:properties
operacjami drzewa i (dodawanie, usuwanie, zmiana nazw plików i katalogów).Pliki binarne mogą również powodować problemy, nie wiem jak łata (lub TortoiseSVN w tym przypadku je obsługuje).
źródło
$ patch --strip=0 < stash.patch
sprawi to, że łatka nie będzie pytać o nazwę pliku podczas nakładania łatki.Najprostszym sposobem byłoby użycie gałęzi tymczasowej, takiej jak ta:
Można to (i prawdopodobnie należy) umieścić w skrypcie, jeśli jest wykonywane częściej.
źródło
Od 1.10.0 (2018-04-13) masz
svn shelve
polecenie eksperymentalne . ( TortoiseSVN obsługuje polecenie ) Zapisywanie łatki i stosowanie jej jest niczym innym jak pomocnikiem, więc ma takie same ograniczenia jaksvn diff
+patch
(tzn. Nie obsługuje plików binarnych i nazw). ( Edycja : Wygląda na to, że obsługa binarna będzie dostępna w następnej wersji 1.11.0 )Edytuj ^ 2: W wersji 1.11.0 (wydanej 30.10.2018) obsługiwane są pliki binarne . Pliki o zmienionej nazwie półki pozostały nieobsługiwane. Półki w wersji 1.11 są niezgodne z półkami utworzonymi w wersji 1.10.
Edycja ^ 3: W wersji 1.12.0 (wydanej 24.04.2019), obsługiwane jest kopiowanie i zmiana nazwy . Półki w wersji 1.12 są niezgodne z półkami utworzonymi we wcześniejszych wersjach.
Edycja ^ 4: Nie ma zmian wokół półek z 1.13.0 i 1.14.0 . Polecenia są nadal oznaczone jako eksperymentalne i należy je zdefiniować,
SVN_EXPERIMENTAL_COMMANDS=shelf3
aby włączyć tę funkcję. Wygląda na to, że ta funkcja jest obecnie nienazwana .Uwagi do projektu można znaleźć na Wiki dla programistów .
źródło
Nie wiem, jak to zrobić za pomocą svn. Szczerze mówiąc, radzę użyć
git-svn
repozytorium git, które działa jak kopia robocza svn, i po prostugit stash
z tym korzystać. Wystarczy wymienićgit pull
zgit svn rebase
igit push
zgit svn dcommit
i rzeczywiście można zachować 90% swojej git workflow i nadal rozmawiać z serwerem SVN.źródło
Istnieje niewielki skrypt Python 2 o nazwie
svn-stash
dostępny na licencji GPL 3: https://github.com/frankcortes/svn-stash .Działa jak
svn diff/patch
wspomniane rozwiązania i oferuje wypychanie i wyskakiwanie zmian jako różnic do jakiegoś lokalnego katalogu. Niestety skrytek nie można nazwać, a tylko ostatnią można wysunąć (cóż, tak, to jest stos, ale nie ma prawdziwego powodu takiego ograniczenia). Ale wtedy zawsze możesz wbudować brakujące funkcje w źródło.Jest napisany dla * ix, ale po zamianie każdego „/”
os.sep
działa również pod Windows.Jeśli używasz svn w wersji 1.7 lub nowszej, musisz zmienić
is_a_current_stash()
: usuń linięif ".svn" in os.listdir(CURRENT_DIR):
, ponieważ jest tylko jeden podkatalog .svn najwyższego poziomu w 1.7 toaletach.źródło
Możesz to łatwo zrobić za pomocą Intellij IDEA - Shelve Changes
źródło
metadata changes
idirectory creates/deletes
? Jak dokładnie to, cogit stash
robi?Inną opcją jest skopiowanie bieżącej kasy do nowego katalogu i przywrócenie wszystkich zmian. w ten sposób zaoszczędzisz kłopotów związanych z tworzeniem tymczasowej gałęzi na serwerze - w końcu ukrywanie jest operacją lokalną, której nie wszyscy powinni widzieć i którą można wykonywać dość często.
po zatwierdzeniu poprawki możesz zaktualizować główną kopię roboczą i usunąć „obszar przechowywania”
źródło
Chciałem też tę funkcję. Obecnie używam TortoiseSVN.
Nie znalazłem trwałego rozwiązania poza eksportowaniem drzewa, przywróceniem do repozytorium, dokonaniem zmian i zatwierdzeniem, a następnie porównaniem zmian z wyeksportowanego drzewa z powrotem do katalogu kontrolowanego przez źródło za pomocą narzędzia takiego jak Beyond Compare.
Lub innym rozwiązaniem może być przejście z HEAD do innego katalogu, dokonanie zmian i zatwierdzenie. Gdy będziesz gotowy połączyć je z powrotem w drugą kopię roboczą, wykonaj aktualizację i scal zmiany.
źródło
Zawsze mam drugą kasę, którą nazywam „trunk_clean”. Ilekroć muszę dokonać szybkiej, odizolowanej zmiany związanej z tym, co robię, po prostu zatwierdzam tę kasę.
źródło
Powyższe pomysły dotyczące rozgałęziania i łatania są świetne, ale dla mnie nie działają dobrze. Używam wizualnego narzędzia do porównywania, więc uruchamianie
git diff
nie powoduje tworzenia poprawek tekstowych. Nasz system kompilacji uruchamia nowe środowisko za każdym razem, gdy tworzona jest gałąź, więc tworzenie tymczasowych gałęzi „ukrytych” byłoby nieporządne.Zamiast tego napisałem mały skrypt powłoki, który kopiuje plik do katalogu „shelf”, dodaje znacznik czasu i cofa zmianę. Nie jest tak solidny jak powyższe rozwiązania, ale pozwala także uniknąć niektórych pułapek, na które wpadłem.
źródło
Na podstawie odpowiedzi Waltera stworzyłem następujące aliasy w moim pliku bashrc:
Te aliasy są znacznie łatwiejsze w użyciu i zapamiętywaniu.
Stosowanie:
svn.stash, aby ukryć zmiany i svn.stash.apply, aby zastosować ukryty .
źródło
W swojej praktyce używam
git init
do tworzenia repozytorium Git wtrunk
katalogu mojego repozytorium Subversion, a następnie dodaję*.git
do wzorców ignorowania Suctions.Po zmodyfikowaniu niektórych plików, jeśli chcę kontynuować pracę z linią główną Subversion, po prostu używam
git stash
do ukrycia mojej pracy. Po zatwierdzeniu do repozytorium Subversion używamgit stash pop
do przywracania moich modyfikacji.źródło
Posługiwać się:
Utworzy gałąź z bieżącej lokalizacji i bieżącej wersji, a następnie zatwierdzi zmiany w kopii roboczej do tej gałęzi bez przełączania się na nią.
Pamiętaj, że zmiany w kopii roboczej nie zostaną automatycznie przywrócone (
cp
to tylko zmiany CoPying w nowym oddziale) i musisz je ręcznie przywrócić.Aby przywrócić zmiany, możesz po prostu scalić zmiany z nowo utworzonego oddziału do kopii roboczej.
--ignore-ancestry
jest używany, aby nie aktualizować informacji o scaleniu w kopii roboczej.Posługiwać się:
aby zobaczyć, co masz na skrytce. Zatwierdzone wersje są również drukowane.
Jeśli nie potrzebujesz już skrytki, po prostu uruchom:
To rozwiązanie jest lepsze niż używanie łaty, ponieważ jeśli nowe zmiany w kopii roboczej lub w bieżącym oddziale powodują konflikt ze zmianami w skrytce, możesz rozwiązać konflikty za pomocą svn, podczas gdy
patch
w niektórych przypadkach po prostu się nie powiedzie, a nawet zastosuje nieprawidłowo.źródło
Ponieważ Subversion nie obsługuje
stash
idealnie funkcji,po prostu robię to ręcznie.
Umieść
Development
iProduction(release)
rzutuj na oddzielną ścieżkę.Możesz pracować nad wszystkimi nowymi funkcjami dla swojego projektu na ścieżce programistycznej,
popełniłbyś jedynie znaczący postęp lub coś powinno zostać wydane dla stabilnego.
Kiedy musisz wydać go do produkcji, otwórz projekt produkcyjny, zaktualizuj svn i zrób rzeczy do wydania (kompilacja, eksport ... itd.).
Wiem, że jest to trochę kłopotliwe, ale zwalnianie postępu nie zdarza się często (nie dotyczy mnie, ale wiem, że niektóre projekty tak robią) w porównaniu z rozwojem postępu, w ten sposób pasuje mi.
Używam svn do konkretnych projektów, ponieważ członkowie zespołu projektowego go używają, więc muszę podążać.
Najlepszym rozwiązaniem jest użycie,
git
który ma doskonały system kontroli wersji i lepszy niżsvn
.źródło
dev
iprod
, 2 sytuacji. Opracowanie całkowicie nowej funkcjonalności byłoby skomplikowane przy pomocy svn. Nie jestem pewien, czy istnieje jasna metoda rozwiązania twojej sprawy w świecie svn.