Wolę Mercuriala od Gita. O przyczynach nie będę
się dziś rozwodził, chodzi o używalność a nie o funkcjonalność (ta
jest obecnie niemal identyczna). W każdym razie, wolę pisać hg
niż
git
, a mój hobbistyczny kod po trochu publikuję na
Bitbuckecie.
Niemniej - zdarza mi się chcieć pobrać (częściej), a nawet poprawić (rzadziej), jakiś kod opublikowany na GitHubie. W metodzie nie ma nic trudnego ale łatwo zapominam właściwy zapis, dlatego pozwolę sobie na bieżącym przykładzie zanotować.
Przygotowanie
Potrzebnym narzędziem jest (pomijając Mercurial) dodatek hg-git, który zainstalowałem w najprostszy dostępny sposób:
$ sudo easy_install hg-git
(poza samym dodatkiem zainstalował się też moduł
dulwich)
a aktywowałem wpisując w ~/.hgrc
(można też w /etc/mercurial/hgrc.d/hgext.rc
):
[extensions]
# ...
hggit =
Od tego momentu mercurial umiał wymieniać dane z gitowymi serwerami.
Na komputerze z nowszym Ubuntu wystarczyło:$ sudo apt-get instal python-dulwich
$ sudo apt-get install mercurial-git
Drugim elementem przygotowań było skonfigurowanie dostępu SSH do githuba.
Tu nie ma nic specyficznego dla Mercuriala – wrzuciłem klucz publiczny
przy pomocy okna kluczy SSH githuba
i przetestowałem próbując sklonować gołym gitem pierwsze z brzegu repozytorium
(git clone git@github.com:Mekk/test.git
).
Wykorzystanie
Rozglądając się ostatnio po możliwościach bezpiecznego przechowywania haseł wykorzystywanych w skryptach perlowych trafiłem na moduł Crypt::PWSafe3, a próbując go użyć, zauważyłem łatwą do usunięcia usterkę. Kod modułu okazał się być hostowany na githubie. Na początek pobrałem kod:
$ hg clone git://github.com/TLINDEN/Crypt--PWSafe3.git
destination directory: Crypt--PWSafe3
importing git objects into hg
updating to branch default
12 files updated, 0 files merged, 0 files removed, 0 files unresolved
Powstało repozytorium mercurialowe powielające historię oryginału:
$ cd Crypt--PWSafe3
$ hg summary
parent: 1:ea1a7485e80c default/master tip
fixed rt.cpan.org#75145. rt.cpan.org#75146.
branch: default
bookmarks: *master
commit: (clean)
update: (current)
hg-git mapuje gitowe branche na mercurialowe bookmarki (którym faktycznie funkcjonalnie odpowiadają), w szczególności jak widać powstał bookmark
master
.
Zerknąłem na kod, poprawiłem usterkę, zacommitowałem lokalnie
(normalnym hg commit
) i zdecydowałem się oddać poprawkę autorowi.
Zrobiłem zatem na githubie swój fork (po prostu klikając przycisk Fork
na stronie oryginalnego repozytorium).
Następnie zanotowałem sobie jeszcze oba wykorzystywane adresy w
swoim Crypt--PWSafe3/.hg/hgrc
:
[paths]
official = git://github.com/TLINDEN/Crypt--PWSafe3.git
github = git+ssh://git@github.com:Mekk/Crypt--PWSafe3.git
Dokończyłem robione poprawki, scommitowałem je i wgrałem do swojej kopii na githubie:
$ hg push github
i zakończyłem całą operację wysyłając pull request czyli prośbę o pobranie zmian:
Autor pobrał je i wykorzystał, co kończy sprawę.
Docelowo zarówno moje lokalne repozytorium, jak mój fork, skasuję ale chwilowo jeszcze się modułowi przyglądam. A polecenie
$ hg pull official
dobiera świeże zmiany głównego autora.
I jeszcze o jednym możliwym problemie: jeżeli przy push-u na githuba
zmiany nie pojawiają się albo są niekompletne, trzeba zweryfikować
stan bookmarka master
(Git w przeciwieństwie do Mercuriala nie akceptuje
nie oznaczonych nazwą commitów). O ile nie jest ustawiony na najnowszym
commicie, trzeba go przesunąć:
$ hg bookmark -r tip -f master
Po tej operacji push powinien zabrać wszystkie zmiany.
Można też stosować własne bookmarki, np. po:
$ hg bookmark traverse_if
$ # hack hack
$ hg commit -m "Implemented blah blah"
$ hg push github
na githubie pojawi się branch traverse_if
(który można niezależnie
zaoferować jako pull request).
Uwagi dodatkowe
Istnieje też projekt odwrotny, pozwalający dobierać się gitem do repozytoriów Mercuriala: git-hg. Nie testowałem.