Dies ist eine alte Version des Dokuments!


Versionsverwaltung mit Git

GitLab

Für die Software-Verwaltung der Arbeitsgruppe wird das GitLab-System genutzt, das unter https://git.ps.informatik.uni-kiel.de/ erreichbar ist. Informationen zur Struktur und Verwendung von Gitorious findet man in der GitLab-Beschreibung der Arbeitsgruppe.

Hier werden im folgenden nur einige Hinweise zur Benutzung von Git gegeben.

Benutzung von Git

Very nice and short tutorial:

http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html

It is a good idea to introduce yourself to git with your name and public email address before doing any operation. The easiest way to do so is:

  git config --global user.name "Michael Hanus"
  git config --global user.email mh@informatik.uni-kiel.de

Now, to get started: create a new project in Gitorious (ask the admin!) and clone it, e.g.,

  git clone git@git.ps.informatik.uni-kiel.de/theses/2013-joe.git MyThesis

This creates a new directory MyThesis which can be managed by git. Go into this directory

  cd MyThesis

The fastest way to work is git is to call

  git gui

in the created directory, as that gui is simple and well designed. Normally you do not need command line information until after some getting used to the system.

Tricks und Kniffe

Zeilenumbrüche mit Unix und Windows

Während Windows Zeilenumbrüche durch ein CRLF darstellt (carriage return/line feed), nutzt Unix nur LF. Werden unterschiedliche Systeme für dasselbe Repository verwendet ist es also sinnvoll, eine automatische Konversion vorzunehmen. Vorgeschlagen wird Folgendes:

  • intern wird LF verwendet
  • Bei Unix-Systemen werden fälschlich eingecheckte CRLF beim Auschecken in LF umgewandelt
  • Bei Windows-Systemen werden LF beim Auschecken in CRLF umgewandelt, beim Einchecken geschieht dies anders herum, CRLF werden in LF umgewandelt

Hierzu sollte man folgende Einstellung vornehmen:

Für Unix:

git config --global core.autocrlf input

Für Windows:

git config --global core.autocrlf true

Datei(en) aus Git Historie entfernen

Manchmal passiert es, dass man aus Versehen eine oder mehrere Dateien zum Repository hinzufügt. Auch wenn man diese anschließend wieder löscht bleiben sie dennoch in der Git Historie enthalten. Hat man beispielsweise ein bin-Verzeichnis eingecheckt, kann dies sehr schnell diverse MiB bedeuten die jeder Nutzer mit auschecken muss.

Um diese aus der Historie komplett zu entfernen, kann man Folgendes tun, um das bin/-Verzeichnis zu entfernen:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch bin/'

Dieser Befehl entfernt den Unterordner aus der gesamten Historie. Soll die Historie erst ab einem bestimmten Commit verändert werden, geht dies mit:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch bin/' -- abcd1234..^

wobei abcd1234 der entsprechende Commit ist.

Anschließend müssen noch entsprechende Verweise entfernt werden:

rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune --expire now

Danach sind die Daten dauerhaft aus der Historie entfernt. Weitere Details finden sich in folgendem Artikel: Git Internals - Maintenance and Data Recovery

Farbiger Prompt

Auch wenn man gerne mit der Konsole arbeitet möchte man vielleicht etwas Farbe in seine Ausgabe bringen. Dies erreicht man einfach per:

git config --global color.ui true

Veraltete Remote Branches löschen

Durch folgenden Ablauf kann es passieren, dass man in seinem lokalen Repository eine Referenz zu einem gelöschten Remote Branch erhält:

$ git branch feature       # neuen Feature Branch erstellen
...                        # Commits
$ git push feature origin  # Branch zu Remote Repository hinzufügen
...                        # weitere Commits
$ git checkout master      #
$ git merge feature        # Feature Branch in master mergen
$ git push origin :feature # Feature Branch im Remote Repository löschen
$ git branch -D feature    # Feature Branch lokal löschen

Nun ist der Remote Branch feature aber lokal noch sichtbar:

$ git branch -a
master
remotes/origin/feature
remotes/origin/master

Um solche Branches zu löschen hilft folgendes Kommando:

$ git remote prune origin --dry-run
Pruning origin
URL: <some url>
 * [would prune] origin/feature

Mit der Option –dry-run wird nur angezeigt, was getan werden würde (nützlich zum Testen), ohne diese Option werden die Branches entfernt.

$ git remote prune origin
Pruning origin
URL: <some url>
 * [pruned] origin/feature

Ignorierte Dateien anzeigen

Möchte man sich die Dateien anzeigen lassen, die Git ignoriert (hilfreich z.B. zum Aufräumen), so hilft folgender Befehl:

git ls-files --others -i --exclude-standard

Alternativ geht auch:

git clean -ndX

Unterordner in separates Repository extrahieren

Angenommen man hat ein Repository, aus dem man einen Unterordner in ein separates Repository extrahieren möchte:

project/
  - presentation/
  - src/
  - theses/

Wir wollen nun den Ordner src/ in ein neues Repository auslagern:

git clone <url> project-src
cd project-src
git filter-branch --subdirectory-filter src HEAD

Nach dem Auschecken filtern wir also alle Commits heraus, die nicht den Ordner src betreffen, und die Inhalte werden aus src in den Hauptordner verschoben.

Nun kann man noch ein bisschen aufräumen:

git reset --hard
git gc --aggressive
git prune

Remote-Tags löschen

You probably won't need to do this often (if ever at all) but just in case, here is how to delete a tag from a remote Git repository.

If you have a tag named 12345 then you would just do this:

git tag -d 12345
git push origin :refs/tags/12345

That will remove 12345 from the remote repository.

/srv/dokuwiki/adminwiki/data/attic/user/git.1460557854.txt.gz · Zuletzt geändert: 2016-04-13 16:30 von mga
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0