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