Git
Git ist ein verteiltes Revision Control System für Software und Dateien aller Art (Versionsverwaltung).
Allgemeines
- SaaS-Hoster für Git-Projekte: gitorious.org
- Git-Repositories mit Metaverzeichnis managen mit Perl-Script: siehe LM 08/10 S.116, Listings
- Git und Subversion gemeinsam nutzen (pro-linux.de)
- Git - Revision Control Perfected (linuxjournal.com)
- http://www.mediawiki.org/wiki/Manual:MediaWiki_Git_Guide
- https://de.wikipedia.org/wiki/Git
Cheat Sheets
- git-tower.com
- Interactive Cheat Sheet (ndpsoftware.com)
Bücher und Training
- Git Documentation
- Das Git-Buch von Open Source Press
- Tutorial siehe LU 06/10 S.62
- Introduction to GIT on Linux – Install, Create Project, Commit Files (thegeekstuff.com)
- tryGit Kurs (codeschool.com)
- Pro Git
- Git Book
- Version Control with Git
- gittutorial Manual Page
- Getting Started with Git von DZone
- A successful Git branching model, Branch, rebase, squash, commit
- Commit Often, Perfect Later, Publish Once: Git Best Practices
- MediaWiki Git Guide
- Tutorial "Learning git: Part 1" (de) (musicmatze.wordpress.com)
- EGit Learning Material
- GitHub startet Trainingsprogramm (phpmagazin.de)
Videos
- Linus Torvalds on Git
- Google Tech Talk on Git
- Gerrit Git Review with Jenkins CI
- Introduction to Git by Scott Chacon of GitHub
- GitCasts (Git how-to videos)
- GIT Tutorial - Branching and Merging
- git push to gerrit
- EGit github Tutorial
- Introduction to Continuous Integration (Git and Jenkins)
- Ted talk which refers to Git
Communities
- Git bei Google+
- Git Blame - Announcements
Tipps und Tricks
Git mit großen Dateien
Git wurde nicht für das Speichern sehr großer Dateien konzipiert. So werden alle Dateien vor dem Speichern auf Festplatte erst in das RAM geladen, um z.B. SHA-1 Checksummen zu bilden. Daher muss so viel RAM installiert sein, dass jede Datei einzeln hinein passt. Auch ist der I/O-Durchsatz entscheidend für die Performance.
Falls Git große Dateien verwalten soll, bietet sich die Verwendung von git-submodule an.
Alternativen:
- git-annex, speichert nur die Metadaten in Git, läuft nicht unter Windows, siehe auch Large file management with git-annex
Siehe auch:
- Managing large binary files with git (stackoverflow.com)
Performance
Man sollte von Zeit und Zeit die Garbage Collection laufen lassen. Siehe GC.
Git hinter einem HTTP-Proxy
Entweder über Shell-Variable
export http_proxy=http://localhost:3128
oder in Git Config eingebaut
git config --global http.proxy http://localhost:3128
Siehe auch Git Tutorial.
Achtung: Git Repositories müssen dann auch per HTTP/HTTPS angesprochen werden (nicht per git Protokoll).
GUI
- gitk
- gitweb
- Gitblit
- SourceTree - für Windows und Mac
Git und Eclipse
- http://www.eclipse.org/egit/
- http://wiki.eclipse.org/EGit/User_Guide
- http://wiki.eclipse.org/EGit/User_Guide/Remote
Git und KDE
Unter KDE wird beim Pushen auf Kommandozeile i.d.R. das Programm /usr/lib/ssh/ssh-askpass verwendet. Siehe Eintrag mittels:
echo $SSH_ASKPASS
Normalerweise startet dann ein KDE-Dialog zur Eingabe des Passworts und das Passwort wird im KDE-Wallet gespeichert.
Wichtig: Für das HTTP(S)-Protokoll muss in der Git-Config auch der Username hinterlegt sein, sonst klappt das Authentifizieren nicht, also z.B. so:
[remote "origin"] url = https://USERNAME@github.com/pfad/zum.git fetch = +refs/heads/*:refs/remotes/origin/*
Weblinks:
- http://grubix.blogspot.co.nz/2011/11/git-https-and-kwallet-update.html
- http://forums.opensuse.org/english/get-technical-help-here/applications/482372-how-disable-git-haskpass-kwallet-integration.html
Server
- Gerrit - Git Code Review und Repository Server: steuert Access Control, Projekte
- Jenkins - continuous integration server
- Gitblit
- Gitweb
Auch als Dienstleister:
- Github - Free public repositories, collaborator management, issue tracking, wikis, downloads, code review, graphs and much more
- Gitorious - Host your open source projects and their repositories for free on Gitorious to enable community contributions.
- Plattform ist OSS
- Bitbucket - Store all of your Git and Mercurial source code in one place with unlimited private repositories. Includes issue tracking, wiki, and pull requests. Secure hosting with flexible permissions for your repositories. Integrates with JIRA, Jenkins, Pivotal, Cloud9 IDE and other developer tools.
Tools
Git Report
- http://gitreports.com
- http://phpmagazin.de/news/Git-Reports-Private-GitHub-Repositorys-fuer-anonyme-Bug-Reports-freigeben-169461
Begriffe
- Index = Staging Area
Kommandos
Konfiguration
- Konfiguration von $HOME/.gitconfig
git config --global user.name 'Max Mustermann' git config --global user.email Max.Mustermann@example.com git config --global color.ui auto git config --global -l git config --global -e man git-config
- Hinweis: ohne --global wird lokale Repository-Konfig editiert, mit --system die systemweite Konfig
- Konfiguration für einzelnes Repository
git config user.email Max.Mustermann@example.com
Lokales Repository
- Projekt initialisieren (Vereichnis darf schon Files enthalten)
cd /etc git init apache2
oder gleichwertig
cd /etc/apache2 git init
Hinweise:
- erzeugt /etc/apache2/.git
- apache2 ist das Reposhttp://stackoverflow.com/questions/2199897/how-to-convert-a-git-repository-from-normal-to-bareitory
- Alle Files zum Index hinzufügen
cd apache2 git add *
- Veränderung an einer einzelnen Datei zum Index hinzufügen
git add
- Veränderungen aller Dateien in Index übertragen, jedoch noch kein Commit
git add -u
- Commit (direkt mit Kommentar, Kommentar wird abgefragt, verbose)
git commit -m "First commit" git commit git commit -v
- Hinweis: git commit zeigt Änderungen an, die noch nicht im Index sind (staged), und listet noch nicht hinzugefügte Dateien
- Commit mit Umgehung des Index (sofort vom Working Tree ins Repository)
git commit -a -m "Comment"
- Letzten Commit widerrufen und mit neuem Kommentar bzw. neuen Dateien erneuern
git commit --amend
- Einen Branch erzeugen
git branch next
- Alle lokalen Branches anzeigen
git branch
- Alle Branches anzeigen - auch die Remote-Tracking-Branches
git branch -a
- Einen Branch auschecken (auf den dann die Änderungen im Working Tree wirken)
git checkout master git checkout next
- Einen Branch next mit Änderungen nach master mergen
git checkout next -> Datei editieren git add <datei> git commit git checkout master git merge next git push (Änderungen Richtung Remote)
- Einen Merge zurücknehmen (z.B. wenn Fehler oder Probleme auftauchten)
git reset --merge
- Unmerged Branches ausgeben
git branch --no-merged
- Projektgeschichte ansehen (letzte 4 Commits, zeitliche Einschränkung)
git log -4 --color-words git log --after='2011-31-12' git log --before='2011-31-12' git log --since='yesterday' git log --format=fuller
- Unterscheide anzeigen (zum letzten Commit)
git show --color-words git log -p --color-words
- Unterschiede anzeigen zw. Working Tree und Index (vor Commit)
git diff --color-words
- Unterschiede anzeigen zw. Index und Repository
git diff --staged --color-words
- Muster in allen Dateien durchsuchen
git grep muster
- Muster in bestimmten Dateien durchsuchen (hier .conf)
git grep muster -- '*.conf'
Remote Repository
- ein existierendes lokales Repository erstmals auf einen Server pushen
git remote add origin ssh://user@gitserver:29418/repo.git git push -u origin master
- Clone erzeugen mit Referenz auf Origin
git clone ssh://user@gitserver:29418/repo.git
- Einen (lokalen) Branch auschecken (auf den dann die Änderungen im Working Tree wirken)
git checkout master
oder für Branch next
git checkout next
- Einen Remote-Branch auschecken (der lokal noch nicht existiert) und dabei einen neuen lokal erzeugen [1]
git checkout -b local-name origin/remote-name
- Einen neuen Remote-Branch, der nicht lokal existiert, in den aktuellen Branch mergen (ohne Remote-Branch zuvor lokal auszuchecken):
git fetch (nicht "git merge" !!!) git log origin/branch-new git merge origin/branch-new
- Änderungen vom Remote herunterladen
git pull
- Änderungen nach Commit zum Remote hochladen (Origin darf nicht bare sein, s.u.)
git push
- Neue lokale Branches nach Remote pushen
- Einen (neuen) Branch einmalig nach Remote pushen (wird dort automatisch erzeugt)
git push origin next git push --all
- Oder besser den neuen Branch dabei sofort in die Upstream-Konfig übernehmen, damit nachfolgend git push ausreicht:
git push -u origin next
- Oder (nachträglich) den Upstream umkonfigurieren, Remote Branch origin/alpha muss jedoch schon existieren - ggf. mit Gerrit anlegen und pullen [2]
git branch -u origin/alpha alpha
- Konfig .git/config
[remote "origin"] url = ssh://user@gitserver:29418/repo fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [branch "next"] remote = origin merge = refs/heads/next
Remote Repository auf gleichem Host
- Clone erzeugen mit Referenz auf Origin
cd /tmp git clone /etc/apache2
erzeugt /tmp/apache2
- Für einen Push von Änderungen nach Origin muss das Origin bare sein (ohne .git, ohne working directory). Siehe auch [3]. Daher sollte in so einem Fall das Origin so erzeugt werden:
cd /etc/apache2 git init --bare
- Server wie Gerrit erzeugen Repositories standardmäßig als "bare" ohne working directory.
- Siehe [4] wie man von non-bare nach bare konvertiert, z.B. mittels
git clone --bare /etc/apache2
erzeugt Verzeichnis
apache2.git