Upload
friprogsenteret
View
865
Download
0
Embed Size (px)
DESCRIPTION
Marcus Rambergs foredrag under GoOpen 2009
Citation preview
G(et)it nå!
Marcus Ramberg
Nordaaker Ltd
@marcusramberg (Twitter)
I denne presentasjonen
● Hvorfor versjonskontroll?
● Et historisk perspektiv
● Viktige konsepter
● Git i daglig bruk
● Snedige 3. parts-tillegg
Hvorfor versjonskontroll?
● Forutsetting for samarbeid
● Men også alene
● Undo for kodebasen din
– cp Codebase Codebase.goodCopy
– cp Codebase Codebase.reallyGoodCopy
● Forutsetning for kontroll
● Utvikle fere funksjoner parallelt (Grener)
Et historisk perspektiv
● ~1960 CDC Update IBM IEB_Update, første
SCM verktøyene (Kort-baserte)
● 1972 Bell Labs fnner opp diff algoritmen
● RCS (Sent på 1970-tallet
– Revision Control System
– Låser alle fler
– Skalerer dårlig med fere utviklere.
– Fortsatt nyttig for å jobbe med binærobjekter
Et historisk perspektiv
● Patch 1985
● CVS (1986)
– Concurrent Versison System
– Lar fere redigere samme fl
– Defakto verktøy i UNIX miljøet 1990-tallet
Et historisk perspektiv
● SVN
● Annonsert in 2000 som en erstatning for
CVS
– Atomiske commit
– Lagrer fytting og kopiering av fler. Sporer hele
endringer samlet, heller enn enkelt-fler.
– Støtter Webdav-basert protokoll
– SVK er et påbygg som gir distribuert støtte for
SVN
Et historisk perspektiv
● Tidlig på 2000 tallet, første distribuerte
systemer som GNU arch og BitKeeper
● 2005 – Linus thorvalds starter Git
prosjektet etter kontrovers rundt
Bitkeeper-lisensiering.
● Ps: det fnnes fere systemer som
Perforce, Rational og Microsoft Source
Safe som ikke ble nevnt i denne
historikken.
Git er:
● Distribuert
● Kjapt og skalerbart til store kodebaser
● Open Source (GPL V2)
● Basert på å lagre snapshots, ikke diffs
● Tilgjengelig i de feste unix distribusjoner.
● Tilgjengelig som installasjonspakker for
Windows og OSX.
Git er ikke:
● SVN
– Git er ikke det neste logiske steget på stigen
fra RCS -> CVS -> SVN
● Kjempe-enkelt
– «With great power comes great reponsibility»
– Git kan være litt frusterende i starten.
Viktige konsepter
● Sentralisert vs Desentralisert
● .git - flstruktur
● Objektdatabase
● «Plumbing» og «Porclain»
Sentralisert versjonkontroll
Arbeidskopi
Tjener
Arbeidskopi
Arbeidskopi
Arbeidskopi
Arbeidskopi Alice Bob
Charlie Dixe
Desentralisert versjonkontroll
Arbeidskopi
Tjener
Tjener
Tjener
Tjener
Tjener Alice Bob
Charlie Dixe
Tjener
Charlie's Laptop
Offine
● Diff
● Copy
● Add
● Commit
● Checkout branch
● Merge branch
● Blame
● Tag
● Alt untatt push/pull
.git
● En katalog i roten av hvert prosjekt:
|-- HEAD # peker til aktiv gren
|-- config # instillinger for dette prosjektet
|-- description # beskrivelse av prosjektet
|-- hooks/ # automatiske handlinger
|-- index # index file ( Hva er planlagt til neste commit)?
|-- logs/ # Historikk over grenene dine
|-- objects/ # Objektene til prosjektet (commiter, trær, blober, tagger)
`-- refs/ # Pekere til grenene dine
Informasjon lagres i objektdatabase
id(object) = SHA1(innholdet i flen)
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
66796679
eab4eab4
Innhold lagres i blob objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
#include <stdio.h>#include <stdio.h>
int main ()int main (){{ printf(”Hello World”);printf(”Hello World”); return 0;return 0;}}
66796679
eab4eab4
Struktur lagres i tree-objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
040000 tree fec552 src040000 tree fec552 src100644 blob cdea5 hw.c100644 blob cdea5 hw.c100644 blob b45d5 100644 blob b45d5 INFOINFO
66796679
eab4eab4
Historikk lagres i commit-objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
tree eec64...tree eec64...parent c9781...parent c9781...author Tom <author Tom <[email protected]@...>> 1204666883 +01001204666883 +0100committer Maxcommitter Max <<[email protected]@...>> 120 1204666883 +01004666883 +0100
Fixed a major bug in Fixed a major bug in Hello World.Hello World.
66796679
eab4eab4
Referanser lagres i tag-objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
66796679
eab4eab4
object 92e86...type committag v1.0.7tagger Jack <jack@...> 1136523576 -0800
GIT 1.0.7-----BEGIN PGP SIGNATURE-----Version: GnuPG v1.4.2 (GNU/Linux)
iD8D…-----END PGP SIGNATURE-----
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
66796679
eab4eab4
v1.0v1.0
alpha-3alpha-3
mas
ter
mas
ter
feat
ure-
Xfe
atur
e-Xgrener
tags
as aliases of objects (usually commits)
Peker på et commit objekt
En viktig konsekvens:
Git er kjapt!
Git-kommandoer - UNIX-flosof
Porselenet
I daglig bruk
$ cd ~/Source/latest-project
$ git init
$ git add .
$ git commit -m'First post'
● Lav kostnad for å komme igang
Hent info om repo
$ git status
$ git log
$ git show e6bf359ac52200efe9e46a1
$ git diff HEAD^
$ git grep foo
$ git blame lib/buildbreaker.c
Kan legge til noder etter behov.
F.eks kan bob ha forket mitt repository og
gjort noen endringer jeg ønsker å hente
$ git add remote bob git://bob/o.git
$ git pull bob
Split & Hersk
$ git clone git://git.no/foo.git foo
$ vi foo.pl
$ git rebase
$ vi bar.pl
$ git add foo.pl bar.pl
$ git format-patch origin/master
Evt. La maintainer pulle direkte fra din fork.
Grener
$ git checkout -b new_branch
$ git branch # vis gren
$ git push origin new_branch
$ git checkout –track -b new_remote_branch
$ git tag v1.0
# Make sure pushed remote branch is setup
retrack = "!retrack() { git config \"branch.$1.remote\" $(dirname \"$2\"); git config \"branch.$1.merge\" \"refs/heads/$(basename \"$2\")\"; }; retrack"
$ git retrack foo origin/foo
Pro Tip: retrack your branch
Snedige 3-partstilegg
● Github
● Git-svn
● Easy git
● Gitorious
● gitk/gitx
Github – Open Source hosting
Spore Forks
Github – Sosialt nisje-nettverk
Easy git
● Enkelt påbygg til git
● Kun sukker, fullt kompatibel med git
● Bedre dokumentasjon med eksempler
● Får git til å ligne mer på svn
● Finnes en rekke lignende tillegg
● http://www.gnome.org/~newren/eg/
git-svn
● Bruk git som klient for svn repositories
$ git-svn clone http://svn.url/
$ git-add Changes
$ git-commit -m'Phear it'
$ git-svn rebase
$ git-svn dcommit
Gitosis
● Sett opp din egen git server
● Gir tilgang over SSH uten å trenge egne
brukerkontoer
● Styr tilgangskontroll
● http://eagain.net/gitweb/?p=gitosis.git
● Kombiner med GitWeb for din egen mini-
github.
gitk/gitx
Bonus: git prompt
● Jeg nevnte at Git er kjapt, sant? Hvorfor ikke putte det i
promptet?
function parse_git_dirty {
[[ $(git status 2> /dev/null | tail -n1) != "nothing to commit
(working directory clean)" ]] && echo "*" }
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \
(.*\)/[\1$(parse_git_dirty)]/" }
export PS1='\u@\h \[\033[1;33m\]\w\[\033[0m\]$(parse_git_branch)$
'
presto:
marcus@Command-Central ~/Source/mojomojo[master*]$
Spørsmål?
● Nordaaker leverer blant annet konsulent-
tjenester ifb. med git.
http://nordaaker.com/services.no.html
● Noen skisser ble hentet fra
http://inso.cc/wp/2008/04/10/get-the-git-slides/
● Alt slide-materialet er lisensiert under
Attribution-Share Alike 2.5 Lisensen
1
G(et)it nå!
Marcus Ramberg
Nordaaker Ltd
@marcusramberg (Twitter)
Hvem er jeg?Erfaring med versjonkontroll - Jobb - Brukt diverse verktøy siden 1996. Tidlig, RCS &
CVS. - Innført SVN i flere bedrifter - Evaluerte VCS for SO - Perforce - Open Source - Bruker av diverse tjenester fra Sourceforge til
Google Code. - Satte opp opprinnelig SVN repo for Catalyst - Nylig migrert MojoMojo fra SVN til GitMitt selskap git alle prosjekterOgså dokument-storageDeployer iusethis.com direkte til produksjon via
GitHub. Har også rails applikasjoner som deployer med capistrano og Git.
2
I denne presentasjonen
● Hvorfor versjonskontroll?
● Et historisk perspektiv
● Viktige konsepter
● Git i daglig bruk
● Snedige 3. parts-tillegg
3
Hvorfor versjonskontroll?
● Forutsetting for samarbeid
● Men også alene
● Undo for kodebasen din
– cp Codebase Codebase.goodCopy
– cp Codebase Codebase.reallyGoodCopy
● Forutsetning for kontroll
● Utvikle fere funksjoner parallelt (Grener)
Versionskontroll utenfor utvikling:WikiUndo tracking i Word
4
Et historisk perspektiv
● ~1960 CDC Update IBM IEB_Update, første
SCM verktøyene (Kort-baserte)
● 1972 Bell Labs fnner opp diff algoritmen
● RCS (Sent på 1970-tallet
– Revision Control System
– Låser alle fler
– Skalerer dårlig med fere utviklere.
– Fortsatt nyttig for å jobbe med binærobjekter
Diff fortsatt viktig i dag – unified diff som ble utviklet i 1990 er dominerende stil for patchutveksling
RCS er nyttig f.eks i DNS-systemer hvor du ønsker å låse en zonefil fra å bli redigert av flere samtidig.
5
Et historisk perspektiv
● Patch 1985
● CVS (1986)
– Concurrent Versison System
– Lar fere redigere samme fl
– Defakto verktøy i UNIX miljøet 1990-tallet
Patch utviklet av Larry wall , forfatteren av Perl, og en deltaker på denne konferansen
CVS har versjonsnummer per fil. Sentralisert låsemekanisme. Ingen sporing av kopiering/renaming
. Metadata i hver katalog
6
Et historisk perspektiv
● SVN
● Annonsert in 2000 som en erstatning for
CVS
– Atomiske commit
– Lagrer fytting og kopiering av fler. Sporer hele
endringer samlet, heller enn enkelt-fler.
– Støtter Webdav-basert protokoll
– SVK er et påbygg som gir distribuert støtte for
SVN
Brandet som CVS done right.Samme sentraliserte modell, men sporer endringer i
trær heller enn filer
7
Et historisk perspektiv
● Tidlig på 2000 tallet, første distribuerte
systemer som GNU arch og BitKeeper
● 2005 – Linus thorvalds starter Git
prosjektet etter kontrovers rundt
Bitkeeper-lisensiering.
● Ps: det fnnes fere systemer som
Perforce, Rational og Microsoft Source
Safe som ikke ble nevnt i denne
historikken.
● Merk at det også finnes andre distribuerte VCS som bazaar og hg.
8
Git er:
● Distribuert
● Kjapt og skalerbart til store kodebaser
● Open Source (GPL V2)
● Basert på å lagre snapshots, ikke diffs
● Tilgjengelig i de feste unix distribusjoner.
● Tilgjengelig som installasjonspakker for
Windows og OSX.
Eksempel på store kodebaser som bruker git: Linux, Perl, Gnome, X11 & Wine
Windows-støtte var lenge et problem, og fungerte kun med hjelp av CygWin. Nå finnes msysgit, som inkluderer en installer, samt en portabel versjon som ikke trenger å installeres.
9
Git er ikke:
● SVN
– Git er ikke det neste logiske steget på stigen
fra RCS -> CVS -> SVN
● Kjempe-enkelt
– «With great power comes great reponsibility»
– Git kan være litt frusterende i starten.
Ugyldig mental modell.
Hjelper hvis du er vant med unix modellen.Så blir det skikkelig digg etterhvert
10
Viktige konsepter
● Sentralisert vs Desentralisert
● .git - flstruktur
● Objektdatabase
● «Plumbing» og «Porclain»
11
Sentralisert versjonkontroll
Arbeidskopi
Tjener
Arbeidskopi
Arbeidskopi
Arbeidskopi
Arbeidskopi Alice Bob
Charlie Dixe
Dette er f.eks SVN og CVS
Arbeidskopien innholder ikke historikkKan ikke jobbe offline
12
Desentralisert versjonkontroll
Arbeidskopi
Tjener
Tjener
Tjener
Tjener
Tjener Alice Bob
Charlie Dixe
Tjener
Charlie's Laptop
Hver bruker har et fullverdig tre med historikk, og utveksler sine endringer med «upstream» og «downstream».
I Charlie's eksempel utveksler laptoppen hans infomasjon kun med arbeidsstasjonen, som igjen utveksler informasjon med de andre.
I praksis finnes det ofte et offentlig/sentralt repository, men dette trenger ikke være autorativt.
Eks. Linux
13
Offine
● Diff
● Copy
● Add
● Commit
● Checkout branch
● Merge branch
● Blame
● Tag
● Alt untatt push/pull
SVN var her en forbedring over CVS, som trengte online tilgang til alle operasjoner, inkludert diff.
14
.git
● En katalog i roten av hvert prosjekt:
|-- HEAD # peker til aktiv gren
|-- config # instillinger for dette prosjektet
|-- description # beskrivelse av prosjektet
|-- hooks/ # automatiske handlinger
|-- index # index file ( Hva er planlagt til neste commit)?
|-- logs/ # Historikk over grenene dine
|-- objects/ # Objektene til prosjektet (commiter, trær, blober, tagger)
`-- refs/ # Pekere til grenene dine
Kan flyttes ut av prosjektet ved å sette en ENV variabel
Hooks innholder eksempler. Kan f.eks. Brukes for å sende mail på commit eller sjekke at ting er riktig formattert.
Objektdatabasen skal vi se på straks
15
Informasjon lagres i objektdatabase
Katalogen i .git som vist i forrige slide
16
id(object) = SHA1(innholdet i flen)
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
66796679
eab4eab4
SHA1 – Populær hashing algoritmeSecure Hash AlgorithmSHA-1 (as well as SHA-0) produces a 160-bit digest
from a message with a maximum length of (264 − 1) bits.
Utfases som crypto fra 2010 til fordel for SHA-2Mer enn bra nok for Git's formål.
17
Innhold lagres i blob objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
#include <stdio.h>#include <stdio.h>
int main ()int main (){{ printf(”Hello World”);printf(”Hello World”); return 0;return 0;}}
66796679
eab4eab4
binary large object (Blob)Populær term fra SQL
18
Struktur lagres i tree-objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
040000 tree fec552 src040000 tree fec552 src100644 blob cdea5 hw.c100644 blob cdea5 hw.c100644 blob b45d5 100644 blob b45d5 INFOINFO
66796679
eab4eab4
Flere tre-objekter bygger en trestruktur.Filrettigheter i oktal.
19
Historikk lagres i commit-objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
tree eec64...tree eec64...parent c9781...parent c9781...author Tom <author Tom <[email protected]@...>> 1204666883 +01001204666883 +0100committer Maxcommitter Max <<[email protected]@...>> 120 1204666883 +01004666883 +0100
Fixed a major bug in Fixed a major bug in Hello World.Hello World.
66796679
eab4eab4
Git skiller mellom forfatter og committer
20
Referanser lagres i tag-objekter
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
66796679
eab4eab4
object 92e86...type committag v1.0.7tagger Jack <jack@...> 1136523576 -0800
GIT 1.0.7-----BEGIN PGP SIGNATURE-----Version: GnuPG v1.4.2 (GNU/Linux)
iD8D…-----END PGP SIGNATURE-----
Tags kan signeres kryptografiskKan også pushes upstream
21
a23fa23f
33473347
8e9b8e9b
f943f943
601a601a
cc39cc39
14321432
efa4efa4
17981798
12601260
3e933e93
55925592
dd85dd85
335e335e
57bc57bc
332e332e 23a723a7
34fe34fe cca6cca6
22112211 53905390
93a493a4 cc5ecc5e
b3cab3ca
66796679
eab4eab4
v1.0v1.0
alpha-3alpha-3
mas
ter
mas
ter
feat
ure-
Xfe
atur
e-Xgrener
tags
as aliases of objects (usually commits)
Peker på et commit objekt
Git sporer da siste commit objekt for hver branch du tracker
Git holder også styr på når du sist merget en branch.Merk at når du sletter en branch etter å ha merget
den inn i head forsvinner den fra objektdatabasen, men er fortsatt tilgjengelig i logger i en periode.
22
En viktig konsekvens:
Git er kjapt!
De fleste lokale operasjoner går på under et sekund, inkludert lage ny branch og bytte branch
Undersøkelse fra mozilla fra 2006 viste da at git var betraktelig raskere enn hg og bazar
http://weblogs.mozillazine.org/jst/archives/2006/11/vcs_performance.html
23
Git-kommandoer - UNIX-flosof
Små kraftige kommandoer som har et begrenset område. Alle kommandoene som heter git- kan også kalles via selve git kommandoen med kommandonavnet som parameter
24
Porselenet
Kommandoene du brukerResten kalles plumbing, og trengs ikke for vanlige
brukere / brukes internt i porselenet
25
I daglig bruk
$ cd ~/Source/latest-project
$ git init
$ git add .
$ git commit -m'First post'
● Lav kostnad for å komme igang
Svært kjapt å starte å versjonskontrollere en katalogKrever ikke server
26
Hent info om repo
$ git status
$ git log
$ git show e6bf359ac52200efe9e46a1
$ git diff HEAD^
$ git grep foo
$ git blame lib/buildbreaker.c
Commitish trenger bare nok av commit-meldingen til å være unikt i dette repositoriet
Postfix med ^ referrerer til parent
27
Kan legge til noder etter behov.
F.eks kan bob ha forket mitt repository og
gjort noen endringer jeg ønsker å hente
$ git add remote bob git://bob/o.git
$ git pull bob
28
Split & Hersk
$ git clone git://git.no/foo.git foo
$ vi foo.pl
$ git rebase
$ vi bar.pl
$ git add foo.pl bar.pl
$ git format-patch origin/master
Evt. La maintainer pulle direkte fra din fork.
29
Grener
$ git checkout -b new_branch
$ git branch # vis gren
$ git push origin new_branch
$ git checkout –track -b new_remote_branch
$ git tag v1.0
30
# Make sure pushed remote branch is setup
retrack = "!retrack() { git config \"branch.$1.remote\" $(dirname \"$2\"); git config \"branch.$1.merge\" \"refs/heads/$(basename \"$2\")\"; }; retrack"
$ git retrack foo origin/foo
Pro Tip: retrack your branch
Etter en push av en ny branchSikrer at configen blir satt opp riktig.
31
Snedige 3-partstilegg
● Github
● Git-svn
● Easy git
● Gitorious
● gitk/gitx
32
Github – Open Source hosting
TilbyrWebgrensesnitt for commitsGraferAdmin for bidragsytere
33
Spore Forks
Med en distribuert VCS kan det være mange bidragsytere du ikke har kontakt med
Github lar deg spore dem
34
Github – Sosialt nisje-nettverk
● Click to add an outline
Timeline for utviklereNye prosjekter fra folk du følgerCommits fra jobb-prosjekter.
35
Easy git
● Enkelt påbygg til git
● Kun sukker, fullt kompatibel med git
● Bedre dokumentasjon med eksempler
● Får git til å ligne mer på svn
● Finnes en rekke lignende tillegg
● http://www.gnome.org/~newren/eg/
Jeg bruker ikke detteKan være nyttig i en overgangsfase
36
git-svn
● Bruk git som klient for svn repositories
$ git-svn clone http://svn.url/
$ git-add Changes
$ git-commit -m'Phear it'
$ git-svn rebase
$ git-svn dcommit
Greit hvis du vil teste ut git uten å gjøre en full migrering
37
Gitosis
● Sett opp din egen git server
● Gir tilgang over SSH uten å trenge egne
brukerkontoer
● Styr tilgangskontroll
● http://eagain.net/gitweb/?p=gitosis.git
● Kombiner med GitWeb for din egen mini-
github.
38
gitk/gitx
39
Bonus: git prompt
● Jeg nevnte at Git er kjapt, sant? Hvorfor ikke putte det i
promptet?
function parse_git_dirty {
[[ $(git status 2> /dev/null | tail -n1) != "nothing to commit
(working directory clean)" ]] && echo "*" }
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \
(.*\)/[\1$(parse_git_dirty)]/" }
export PS1='\u@\h \[\033[1;33m\]\w\[\033[0m\]$(parse_git_branch)$
'
presto:
marcus@Command-Central ~/Source/mojomojo[master*]$
40
Spørsmål?
● Nordaaker leverer blant annet konsulent-
tjenester ifb. med git.
http://nordaaker.com/services.no.html
● Noen skisser ble hentet fra
http://inso.cc/wp/2008/04/10/get-the-git-slides/
● Alt slide-materialet er lisensiert under
Attribution-Share Alike 2.5 Lisensen