Git – Aliasy i dodawanie własnych komend oraz problemy z pushem
Użytkownicy SVN którzy przeszli na gita pewnie narzekają (i słusznie zresztą) że w Gicie trzeba pisać bardzo długie komendu np. git commit
podczas gdy w SVN wystarczy poprostu svn co
. Mi to właściwie nie przeszkadzało zbytnio (wychowałem się na gicie ;] ) aż pewnego razu natrafiłem na pozornie niezwiązany problem, mianowicie domyślne zachowanie git push
mi przeszkadzało.
Otóż gdy zrobimy lokalnego brancha, następnie zrobimy push to zgodnie z “common sense” git wypycha masz branch do zdalnego repo.
Ale niestety nie ustawia jednego, mianowicie trackingu tzn. nie zapisuje w configu lokalnego repa “lokalnemu branchowi abc odpowiada zdalny branch efg”. A dokładnie wywala:
You asked me to pull without telling me which branch you want to merge with, and 'branch.z.merge' in your configuration file does not tell me either. Please specify which branch you want to merge on the command line and try again (e.g. 'git pull '). See git-pull(1) for details. If you often merge with the same branch, you may want to configure the following variables in your configuration file: branch.z.remote = branch.z.merge = remote..url = remote..fetch = See git-config(1) for details.
Niby w teorii fix jest prosty, dodajemy w .git/config
:
[branch "nazwa_brancha"] remote = origin merge = refs/heads/nazwa_brancha
i działa, ale robienie to dla paru branchy jest wkurwiające ;]. Znalazłem toola do robienia tego jedną komendą, jest tutaj: http://git-wt-commit.rubyforge.org/ ale denerwowało mnie to że nie można go odpalić “git style” czyli git
Do sedna ;] dla SVNowców:
git config --global alias.co commit git config --global alias.d diff ...
Powyższe komendy (można też wklepać ręcznie w configu , sekcja [alias]) robią tyle że przypisują w domyślnym (--global
) configu komendę git co
do git commit
I teraz jeżeli chcemy zamiast gitowej komendy przypisać “zewnętrzną” komende dajemy na początku !
git config --global alias.publish '!/usr/local/bin/git-publish-branch'
i voila, nowa “komenda” dodana. Git nie pozwala “zredefiniować” istniejących komend żeby uniknąć pomyłek ale można dzięki aliasom usprawnić sobie życie np taki jest mój alias do logu:
git config --global alias.l "log -10 --abbrev-commit --relative-date --format='%Cred%h%Cgreen %aN%Cblue %ar %Creset %s'"
co daje log:
xani@hydra:/mnt/data/linux-2.6$ git l 066000d Ananth N Mavinakayanahalli 26 hours ago Revert "x86, apic: Use logical flat on intel with <= 8 logical cpus" 1b4d40a Linus Torvalds 32 hours ago Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs 79ecb04 Linus Torvalds 32 hours ago Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes db1fc95 Linus Torvalds 32 hours ago Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 00fdb75 Linus Torvalds 32 hours ago Merge branch 'agp-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/agp-2.6 c07d723 Linus Torvalds 32 hours ago Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 6102c31 Linus Torvalds 32 hours ago Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging a29815a Avi Kivity 2 days ago core, x86: make LIST_POISON less deadly c0f607c Linus Torvalds 32 hours ago Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6 598cace David Howells 4 days ago mn10300: update the ASB2303 defconfig
Wracając do “popsutych” pushy, po zaaplikowaniu aliasu wystarczy wydanie jednej komendy do wysłania naszego brancha i ustawienia trackinu:
xani@hydra:~/src/my/ferm-lib$ git publish git push origin x:refs/heads/x Total 0 (delta 0), reused 0 (delta 0) To ssh://git@devrandom.pl/ferm-lib.git * [new branch] x -> x git config branch.x.remote origin git config branch.x.merge refs/heads/x