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.
