GIT

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