Jak zarządzasz drobnymi zmianami, które chcesz zachować lokalnie w rtęci?


9

Rozważam migrację 14-letniego repozytorium CVS (historia nienaruszona) do mercurial. Myślę, że mam wszystkie techniczne bity konwersji, ale wciąż mam pytania dotyczące efektywnej pracy w rtęci.

Jedną z rzeczy, które bardzo często widzę w piaskownicach cvs poszczególnych programistów (w tym mojej), są lokalne niezaangażowane zmiany, które nie są gotowe do wypchnięcia do głównej linii. Rozumiem, że to zła rzecz. Większość moich eksperymentów z hg sugeruje, że niezatwierdzone zmiany są złe. Wystarczy niemożność połączenia się z nimi. Chcę więc wiedzieć, jak radzą sobie z tym inni ludzie używający rtęci w codziennym kodowaniu. Jak radzisz sobie z niekompletnymi zmianami w kodzie, gdy przychodzi czas na aktualizację repozytorium? Jak radzisz sobie ze zmianami lokalnymi, których (jeszcze) nie chcesz udostępniać innym programistom?

Odpowiedzi:


5

Poradzę sobie w ten sposób:

W moim lokalnym repozytorium zatwierdzam każdą zmianę, nawet jeśli eksperymentuję. Jeśli eksperyment jest w porządku i został przetestowany, wypycham go do zdalnego repozytorium. Jeśli nie, pozostaje w moim lokalnym repozytorium (lub wróć do starszej wersji).

Chodzi o to, że zdalne repozytorium zawiera tylko działające, przetestowane wersje moich projektów.


3
Czy uważasz, że twoje zdalne repozytorium jest zaśmiecone zatwierdzeniami typu „naprawiony błąd w ostatnim zatwierdzeniu”?
nmichaels

4

Dodam kilka rzeczy.

Jednym z nich jest zasugerowanie przepływu pracy, który rozsądnie wykorzystuje półkę , która jest standardowo dostarczana z TortoiseHg .

Ilekroć chciałem zatwierdzić część mojego bieżącego katalogu roboczego, odłożyłem na półkę zmiany, których nie chciałem zatwierdzić, ponownie skompilowałem (aby upewnić się, że nie odłożyłem bitów, które teraz powodują przerwanie kompilacji), a następnie uruchomiłem testy . Następnie oddałbym pełny, działający i przetestowany zestaw. W końcu uciekłbym bez pomocy, by przywrócić moje zmiany.

Gdybym miał raczej bardziej trwałe zmiany, powiedzmy, że chcę, aby plik konfiguracyjny na moim komputerze programistycznym zawsze wskazywał na port 3333 hosta lokalnego, a nie na serwer produkcyjny, wtedy rozważałbym użycie rozszerzenia Kolejki Mercurial, które jest dostarczane zarówno z Mercurial, jak i TortoiseHg .


4

Nie wierzę, że niezaangażowane zmiany są z natury złe. Odwołujesz się do „niemożności scalenia się z nimi” - jeśli masz niezaakceptowaną zmianę w jakimś pliku, a wyciągniesz i zaktualizujesz zmianę do tego pliku, Mercurial rozpocznie proces scalania tak, jakbyś go popełnił, a następnie poprosił o połączenie. Miałeś na myśli coś innego?

Tak więc w przypadku lokalnych zmian, których nie chcesz jeszcze udostępniać innym programistom, masz dwa podejścia. Pierwszym jest zachowanie zmian w kopii roboczej, ale nie wypychanie ich, a drugim - odłożenie ich na bok, poza kopię roboczą. Wybór zależy od tego, czy chcesz, aby te zmiany były dostępne podczas pracy.

Jeśli zachowasz je w kopii roboczej, nadchodzące zmiany będą działać dobrze, więc musisz tylko unikać tworzenia zmian wychodzących, a to oznacza, że ​​nie będziesz ich zatwierdzać. Jeśli pliki są nowe, to proste - po prostu hg addich nie rób . Jeśli są już śledzone, możesz w szczególności wykluczyć je z zatwierdzeń za pomocą hg commit --exclude foo.txt. Jeśli masz dużą liczbę plików do wykluczenia lub będziesz je wykluczał z wielu zatwierdzeń (np. W celu trwałej zmiany lokalnego pliku konfiguracyjnego), spójrz na rozszerzenie wykluczania .

Jeśli jesteś przygotowany na przesunięcie zmian na bok, masz inny zestaw opcji. Najprostszą rzeczą jest po prostu użycie hg diffplików do utworzenia łatki opisującej je, którą przechowujesz w bezpiecznym miejscu, a następnie hg patch --no-commitponowne zastosowanie tej łatki, gdy chcesz przywrócić zmiany. Można dokonać tego gładsza instalując rozszerzenie do półek , z rozszerzeniem na poddaszu , albo jakiś inny krewny. Możesz także użyć rozszerzenia kolejek , ale używasz młota, aby złamać orzecha. Możesz nawet po prostu zatwierdzić zmiany, a następnie zaktualizować z powrotem do rodzica i tam wykonać inną pracę, pozostawiając zmiany w hg commit -m 'temporary branch' && hg up $(hg log -r 'parents(.)' --template '{node}')uproszczonej anonimowej gałęzi - (chociaż może być łatwiej to zrobić ręcznie!). Trzeba jednak uważać, aby nie wcisnąć tego zestawu zmian.


3

Do rozdzielenia strumieni rozwoju stosuje się dwa podstawowe podejścia.

  • Nazwane oddziały. Chodzi o to, że pracujesz nad własnym oddziałem, nmichaels_branch_of_awesome. W ten sposób możesz zatwierdzić swoje zmiany bez smażenia pracy innych ludzi. Następnie łączysz się z innymi ludźmi, gdy potrzebujesz ich pracy, a kiedy przychodzi czas na tę funkcję, przesuwasz się do bardziej stabilnej gałęzi w celu integracji. Preferuję nazwane gałęzie.

  • Anonimowy klon. To tworzy oddzielne repozytorium dla twojej piaskownicy. Tutaj bawisz się, dopóki nie dostaniesz tego, co chcesz, a następnie (prawdopodobnie) zrób łatkę MQ dla swoich zobowiązań i przejdź do miejsca, w którym zacząłeś. Nie przepadam za tym podejściem, ponieważ wymaga ono zarządzania katalogami i potencjalnie pracy z MQ, co może być trudne. A przy niektórych repozytoriach mogą zacząć robić to tylko trochę . To powiedziawszy, wydaje się, że jest to preferowane przez twórców z Kiln.


Wygląda na to, że jest ktoś, kogo zadaniem jest wykonanie bitów integracji. Nie jestem skłonny dodawać mq do listy nowych rzeczy, których ludzie będą musieli nauczyć się natychmiast, ale pomyślę o mojej początkowej niechęci do pomysłu nazwanych gałęzi. To może nie być dobrze uzasadnione.
nmichaels

Jeśli chodzi o drugą kulę, dlaczego nie wykonać klonowania, pracować i naciskać tylko po zakończeniu? MQ wydaje się tutaj skomplikowany
TheLQ

@TheLQ: To też działa, ale nie różni się niczym od bezpośredniego klonowania z podstawowego repozytorium. MQ zmiażdżyłby zobowiązania w jednym zatwierdzeniu.
Paul Nathan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.