Git - submoduły i aliasy
Post oparty na prawdziwych wydarzeniach i traumach
Submoduły
Zrobili to! Mimo że protestowałem. Do projektu przy którym pracowałem dodali submoduły.
- Jak mogli to zrobić - zadaje pytanie oburzony.
- Prosto - pada odpowiedź - za pomocą polecenia o składni:
git submodule add link-do-repozytorium opcjonalna-nazwa-folderu
A w tym wypadku było to dokładnie:
git submodule add https://github.com/paulp/sbt-extras.git sbtx
wykonane w folderze projektu.
- Ale po co? - drążę dalej temat.
- Żeby współdzielić kod.
- Przecież do tego służą biblioteki! - moje oburzenie sięga zenitu.
- Ale nie zawsze jest to łatwe i możliwe:
- Biblioteki trzeba wydawać i trzymać je w menedżerze repozytoriów binarnych (ang. Binary Repository Manager), a takiego menedżera trzeba gdzieś zainstalować.
- Menedżer repozytorium binarnych może kosztować, np. dla języka Java jest za darmo, a dla języka JavaScript już niekoniecznie.
- W językach skryptowych biblioteki są często instalowane do interpretera co może utrudniać instalację programu klientowi (przykład z pierwszej wersji Git-Tools-Submodules).
- Nie wszystko da się umieścić w bibliotece, w tym wypadku jest to skrypt do budowania projektu.
Dodatkowe polecenia
Tak przekonany przestałem marudzić i przejrzałem Git-Tools-Submodules, git-submodule oraz git-clone. Okazało się, że praca z submodułami nie jest taka straszna i sprowadza się głównie do dwóch poleceń:
git clone --recurse-submodules
git submodule update --init --recursive
Pierwsze polecenie ściąga repozytorium ze wszystkimi submodułami. Drugie - aktualizuje submoduły po przełączeniu się na inną rewizję (ang. commit), gałąź lub po aktualizacji gałęzi.
Niestety polecenia te wydłużają i tak długie już polecenia gita.
Aliasy Basha
Szczęśliwie umiem rozwiązywać problem długich poleceń, bo znam aliasy basha.
Pierwsza wersja moich aliasów wyglądała następująco:
alias g='git'
alias gcl='git clone'
alias gclr='gcl --recurse-submodules'
alias gupdate='git submodule update --init --recursive'
alias gpr='git pull --rebase'
alias gpru='gpr && gupdate'
alias master='git checkout master && gupdate'
alias develop='git checkout develop && gupdate'
Aliasy Gita
Byłem bardzo zadowolony ze swoich aliasów, więc postanowiłem się nimi pochwalić koledze:
- To bez sensu - odpowiedział zdziwiony - przecież git ma swój system aliasów.
Po przeczytaniu Git-Basics-Git-Aliases i git-config mój zbiór aliasów zamienił się w zestaw poleceń gita do wykonania:
git config --global alias.cl 'clone'
git config --global alias.clr 'cl --recurse-submodules'
git config --global alias.update 'submodule update --init --recursive'
git config --global alias.pr 'pull --rebase'
git config --global alias.pru '!git pr && git update'
git config --global alias.master '!git checkout master && git update'
git config --global alias.develop '!git checkout develop && git update'
git config --global alias.tig '!tig'
Widać tutaj, że podkomenda alias
ma dwie składnie:
git config --global alias.nowa_komenda_gita 'stara_komenda_gita_z_parametrami'
git config --global alias.nowa_komenda_gita '!dowolna_komenda_basha'
I od teraz:
git cl
- klonuje repozytorium;git clr
- klonuje repozytorium razem z submodułami;git update
- aktualizuje submoduły;git pr
- pobiera zmiany ze zdalnego repozytorium;git pru
- pobiera zmiany ze zdalnego repozytorium i aktualizuje submoduły;git master
- przełącza na gałąź master i aktualizuje submoduły;git develop
- przełącza na gałąź develop i aktualizuje submoduły;git tig
- uruchamia programtig
(o ile mamy go zainstalowany).
Polecenia te zapisałem w pliku git_config.sh i można je wykonać poleceniem:
curl -s https://raw.githubusercontent.com/writeonly/cli/master/git_config.sh | bash
Zostaw komentarz