Standardlayout
En mastergren, en utvecklings och en (flera) gren(ar) per feature eller bug. Ex:
A---B---C master
\
D---E utv
\
F feature 50
Absoluta grundkunskaper
$ git branch -d test
Diverse
Ångra placering i index ("unstage"):
$ git reset _filnamnet_
Glömde ändringar i en commit:
$ git add filerna_som_missades
$ git commit --amend
Normal grenhantering
Skapa och aktivera ny gren
$ git checkout -b bug20100421
Byt gren
$ git checkout master
Radera en gren
Problem
old mode / new mode
En massa filer markerade som uppdaterade i statusen, utan att det för den skull finns några skillnader mot index/repo. Vid diff är dessa filer markerade med text om "old mode / new mode", t.ex:
$ git diff
diff --git a/www/backaOmgang.py b/www/backaOmgang.py
old mode 100644
new mode 100755
diff --git a/www/produktinformation.py b/www/produktinformation.py
old mode 100644
new mode 100755
…
Git har då försökt sätta executable-flaggan på dessa filer men inte fått lov av operativet (krävs super user för detta). Så länge som det inte är intressant att sätta dessa flaggor, kan man stänga av det hela genom att sätta core.filemode = false i konfigurationsfilen. Sedan återställer man arbetsmappen till repots läge med hjälp av git reset --hard. Obs! Slår ut eventuella riktiga uppdateringar som gjorts i arbetsmappen, så spara undan eller gör en commit av dessa först.
You have some suspicious patch lines: trailing whitespace
När man försöker genomföra en commit kan man råka ut för meddelandet "You have some suspicious patch lines" följt av en lista med filer där ett fel "trailing whitespace" anges. I mitt fall beror detta ofta på gamla filer som har Mac-radbrytningar istf Unix eller genom en konvertering från exempelvis ett Subversion-repo. Man kan temporärt genomföra den aktuella commiten med git commit --no-verify.
Felet dyker upp genom en hook som egentligen inte skall vara aktiv i en normal git-installation. Denna hook heter pre-commit och kan stängas av genom att antingen stänga av executable-flaggan eller radera filen helt och hållet. Normalt återfinns den i .git/hooks/ i det aktuella repot. Som en sidoparentes kan nämnas att normalt skall ingen av scripten i denna mapp ha executable-flaggan satt, så ett chmod -x .git/hooks/* fixar snabbt detta problem och eventuella andra som kan uppstå.
Inställningsfiler
~/.gitconfig
[user]
name = Fredrik Pihlström
email = fredrik@pihlan.com
[core]
editor = bbedit --encoding utf-8 --resume --wait --
excludesfile = /Users/pihlan/.gitignore
filemode = false
[color]
status = auto
branch = auto
interactive = auto
diff = auto
ui = auto
[gui]
fontui = -family \"Lucida Grande\" -size 11 -weight normal -slant roman -underline 0 -overstrike 0
fontdiff = -family Inconsolata -size 12 -weight normal -slant roman -underline 0 -overstrike 0
~/.gitignore
.DS_Store
Konvertera från Subversion
http://www.kernel.org/pub/software/scm/git/docs/git-svn.html http://progit.org/book/ch8-1.html
Endast konvertering, inte för att senare trycka tillbaka uppdateringar till Subversion.
Lista Subversion-användare i repot:
$ svn log --xml | grep author | sort -u | perl -pe 's/.>(.?)<./$1 = /'
Skapa en fil users.txt med hälp av infon från listan över namn:
pihlan = Fredrik Pihlström <fredrik@relieftryck.se>
Konvertera Subversion repository med standardlayout (exempel med Swedbanks repo "fspa")
$ git svn clone svn://Filserver-2.local/fspa --authors-file=users.txt --no-metadata -s
$ cd fspa
Konvertera Subversion repository med "projektlayout" (exempel med SEB:s repo "seb")
$ git svn clone svn://Filserver-2.local/websystem --authors-file=users.txt --no-metadata -T seb/trunk -b seb/branches -t seb/tags SEB
$ cd SEB
Kontrollera att alla förgreningar och etiketter har hängt med
$ git branch -a
$ git show-ref
Skapa "riktiga" etiketter och grenar
$ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
$ rm -Rf .git/refs/remotes/tags
$ cp -Rf .git/refs/remotes/* .git/refs/heads/
$ rm -Rf .git/refs/remotes
Städa upp
Speciellt bra om det finns många binärfiler i repot
$ git gc --prune
Konvertera alla etiketter till git-etiketter
Eftersom etiketter implementeras som förgreningar i Subversion så blir det en hel del jobb… Exempel:
$ git branch -r
$ git checkout tags/PRE-flerlayouthantering
$ git tag PRE-flerlayouthantering
…
$ git checkout master