Categories

Riding the Git

No Gravatar

Der Doktor und das liebe git…

so ungefähr fühle ich mich in den letzten Wochen in denen ich mich mit Git als SCM beschäftige.

Bevor ich hier weiter in den geistigen Wahnsinn einsteige aber nun einfach mal ein paar Sachen die für die Nachwelt, viel eher für meinen müden Verstand aufbewahrt werden müssen.

The beginning…

1. Ein bestehendes Git Repository “clonen”:

$ git clone git@nagiosprojects.org:test.git

Hieraus erhalten wir nun eine verfolgbare Kopie von dem, was an diesem Git Server gerade aktuell ist, genauer gesagt:

$ git branch
* master

Das ist zumindest das, was man lokal sieht.

GIT ist lokal, GIT lebt lokal – Liebe CVS/SVN User – gewöhnt euch dran.

What we got

2. Wir haben aber doch da etwas von einem Server besorgt, da muss doch mehr sein und natürlich ist das auch so.

$ git branch -r
origin/HEAD
origin/master

Alles auf einmal also:

$ git branch -a
* master
origin/HEAD
origin/master

Wir haben also nun bemerkenswerterweise einen lokalen Branch “Master”, der vom Remote Branch “Master” abhängt.

Via git pull halten wir unseren Master Branch (lokal) auf dem aktuellen Stand.

Lust auf was neues…

Der liebe Herr Git Admin hat uns, niederen Gewärm, also die Möglichkeit geschaffen via SSH getunnelt auf das remote Repository zu schreiben. In Git gesprochen dürfen wir also “pushen”.

Nun sollten wir also zweckdienliche Änderungen an dem jeweiligen Projekt vornehmen und dem Rest der Menschheit wiederum zur Verfügung zu stellen:

$ echo "test" > something.new
$ git status
# On branch master
# Untracked files:
#  (use "git add <file>..." to include in what will be committed)
#
#       something.new
nothing added to commit but untracked files present (use "git add" to track)

Änderungen der Datei unter Versionskontrolle stellen:

$ git add something.new
$ git status
# On branch master
# Changes to be committed:
#     (use "git reset HEAD <file>..." to unstage)
#
#             new file:     something.new
#

Unsere Änderungen lokal committen:

$ git commit -a -m "something new"
Created commit da1f3b0: something new
  1 files changed, 1 insertions(+), 0 deletions(-)
  create mode 100644 something.new

# Änderungen zwischen dem origin/master und unserem lokalen master branch:
$ git diff origin/master master
diff --git a/something.new b/something.new
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/something.new
@@ -0,0 +1 @@
+test

# 'remote' Namen setzen
git remote add remote-test git@nagiosprojects.org:test.git

# Zum Repo pushen:
$ git push remote-test master:refs/heads/te
Enter passphrase for key '/home/test/.ssh/id_rsa': ************
Counting objects: 10, done.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 891 bytes, done.
Total 8 (delta 3), reused 0 (delta 0)
To git@nagiosprojects.org:test.git
   c706011..da1f3b0  master -> te

Nun haben wir erfolgreich etwas ins remote repository hochgeladen, zwar ‘nur’ in unseren Bereich “refs/heads/te” auf den uns der Admin das pushen erlaubt hat, aber immerhin.

Nun könnte der Admin / der Hauptentwickler unsere Änderungen für gut befinden und diese in seinen Master mergen….

CVS Importieren

Mittels eines einfachen Kommandos lassen sich auch per CVS verwaltete Inhalte zu einem git machen. Hier ein Beispiel anhand der NDOUtils Sourcen von Nagios:

cd GIT_DIR
git-cvsimport -p x -v -d :pserver:anonymous@nagios.cvs.sourceforge.net:/cvsroot/nagios ndoutils

Diese müssen dann nur noch entsprechend gepushed werden. git add und git commit sind nach dem cvsimport bereits vollzogen.

Nach dem ersten CVS Import, welches in einem leeren Verzeichniss erstellt werden sollte (das sogleich auch zu einem git repository wird – Voodoo), kann mit o.g. Befehl auch ein späteres CVS Import gefahren werden.