Inhaltsverzeichnis
Distributed version control mit Git
Git ist ein open source distributed version control system ⇒ http://git-scm.com
Als erstes sollte man sich Gedanken darüber machen wie die Struktur der Versionierung aufgebaut werden soll.
Siehe dazu diesen Vorschlag: ⇒ http://nvie.com/posts/a-successful-git-branching-model/
Sind MS tools im Einsatz und es soll migriert werden ⇒ https://www.visualstudio.com/learn/centralized-to-git/ und https://accu.org/index.php/journals/1828.
Wo zu kann Git noch eingesetzt werden ⇒ Archivierung von Projektplänen mit Werkzeugen der Software Entwicklung
Spielerisch Git erlernen
Siehe ⇒ https://ohmygit.org/
Git Client Installieren
Installation und Upgrade Git 2.5 auf Oracle Linux 7
User root
Wird per „yum install git“ (Oracle Linux Server release 7.1) das Package „git“ installiert, ist die Version eine „1.8.3.1“:
#Install yum install git #Show version git version git version 1.8.3.1
Soll die aktuellste Version eingesetzt werden, kann nun per git Kommando der letzte Stand geladen und git neu übersetzt werden.
Vorbereitung: Die notwendigen Basis Pakete installieren bzw. selbst übersetzen falls nicht für OEL 7 verfügbar:
#Make utils yum install autoconf #Perl libraries yum install perl-CPAN #install base packages yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel ######################## #install package for the document feature usage yum install xmlto #install docbook2x # search a rpm over http://rpm.pbone.net/index.php3 #wget ftp://ftp.muug.mb.ca/mirror/fedora/epel/7/x86_64/d/docbook2X-0.8.8-17.el7.x86_64.rpm #yum install docbook2X-0.8.8-17.el7.x86_64.rpm #besser Source Code von http://sourceforge.net/projects/docbook2x/ herunterladen und neu übersetzen #Zuvor Datei configure.ac von http://sourceforge.net/p/docbook2x/bugs/20 austauschen tar xvfz docbook2X-0.8.8.tar.gz cd docbook2X-0.8.8/ wget -O configure.ac http://docbook2x.cvs.sourceforge.net/viewvc/docbook2x/docbook2X/configure.ac ./configure make make install #install asciidoc # see http://www.methods.co.nz/asciidoc/INSTALL.html # Download the zip file with a browser # not working wget -O asciidoc-8.6.9.zip http://sourceforge.net/projects/asciidoc/files/latest/download unzip asciidoc-8.6.9.zip cd asciidoc-8.6.9/ ./configure make install
Git Source laden und neu übersetzen:
cd /srv #git source repository laden git clone https://github.com/git/git cd /srv/git ######################### #Create configure script make configure ./configure --prefix=/usr ######################### #Compile git core and install make all make install #test the version git --version git version 2.5.0.342.g44e0223 ######################### # Create the git documentation make doc make install-doc install-html make info # Problems with /bin/sh: line 1: docbook2x-texi: command not found # docbook2x-texi not availible for my platform ... hmmmm ln -s /srv/docbook2X-0.8.8/perl/docbook2texi /usr/bin/docbook2x-texi #better but make info #make[2]: Leaving directory `/srv/git' # DB2TEXI user-manual.texi #I/O error : Attempt to load network entity http://docbook2x.sf.net/latest/xslt/texi/docbook.xsl # not realy working ... # may be this bug http://sourceforge.net/p/docbook2x/bugs/20/ # load the configure.ac from http://docbook2x.cvs.sourceforge.net/viewvc/docbook2x/docbook2X/configure.ac # copy file to the source directory and recompile/reinstall the docbook2x make install-info
Leider ist mir das Übersetzen der Dokumentation am Anfang nur in Teilen gelungen, das Programm docbook2x-texi fehlt zu Beginn, ein Links auf das richtige Programm hilft dann zwar etwas, für den Folgefehler muss noch ein Patch für docbook2x eingespielt werden, dann funktioniert es.
Quellen
Git 2.5 unter Windows 10
Download der Git Software über https://git-scm.com/downloads, die Website erkennt die richtige Version und startet den Download.
Die Datei (Stand 08.2015) Git-2.5.0-64-bit.exe für die Installation starten:
- Welcome to the Git Setup Wizard - Next
- Legal information - Next
- Verzeichnis auswählen- wie C:\Program Files\Git -Next
- Componenten auswählen - alles Default
- Selct Start Menu Folder - alles Default - git - Next
- Adjust your PATH enviroment - alles Default
- SSH executable auswählen - Option 1 „Use OpenSSH“ auswählen -Next
- Configure line ending conversion - Da mein persönlicher Default Linux ist, Option 2 gewählt, für mehr Windows lastige Projekte ist Option 1 wohl besser -
- Terminal emulator - Default - Use MinTTY - Next
- Performance Tweaks - Nichts angewählt - Default - Next
- Installation läuft
- Finsh
Die Installation benötigt am Ende ~367 MB da auch ein kompletter kleiner minGW64 - Ein runtime environment for gcc dabei ist.
Nach der Installation kann im gewünschten Verzeichnis eine Bash Shell über das Kontext Menü im Explorer gestartet werden. In der Bash Shell kann wie unter Linux gewohnt gearbeitet werden.
Alternative Git Oberflächen unter MS Windows
Oberflächen für das Arbeiten mit Git unter Windows
SoucreTree
Git-Client Tower
Git Hub for Windows
- Als Editor Atom verwenden https://atom.io/ oder https://code.visualstudio.com
Scripten unter MS Windows
Alles einchecken
cd <LAUFWERK> cd <PROJKET_DIR> set GIT_HOME=C:\Program Files\Git "%GIT_HOME%\cmd\git.exe" add . "%GIT_HOME%\cmd\git.exe" commit -m "Commit done by %USERNAME% at %DATE% %TIME%" "%GIT_HOME%\cmd\git.exe" push
Bzw. in der Powershell
set-item -path env:GIT_HOME -value "C:\Program Files\Git" $datum = Get-Date & "$ENV:GIT_HOME\cmd\git.exe" add . & "$ENV:GIT_HOME\cmd\git.exe" commit -m "Commit done by $env:UserName at $datum" & "$ENV:GIT_HOME\cmd\git.exe" push
Alles auschecken:
cd <LAUFWERK> cd <PROJKET_DIR> set GIT_HOME=C:\Program Files\Git "%GIT_HOME%\cmd\git.exe" pull
Git Client Konfiguration
Nach der Installation (unabhängig ob Linux oder Windows) muss git konfiguriert werden.
Unter Linux:
Globale Einstellungen lassen sich unter „/etc/gitconfig“ (alternativ „/usr/git/config“) hinterlegen, persönliche Einstellungen unter „~/.gitconfig“ (alternativ „~/.config/git/config“)
Unter Windows:
Die Bash Emulatoin verwendt als User Home den Windows Pfad (C:\Users\<username>) und legt dort die .gitconfig an.
Globale Konfiguration erfolgt mit „git –system“, hier zum Beispiel um den Editor zu setzen und Farben zu verwenden:
git config --system core.editor vi git config --system color.ui true
User Konfiguration:
git config --global user.name "Gunther Pippèrr" git config --global user.email "info @ pipperr.de"
Konfiguration (ließt über alle Konfigurationsdateien, letzter gefundener Wert wird verwendet) anzeigen:
#All git config --list #One Parameter git config core.editor #kein CRLF auf Windows ! git config --global core.autocrlf false
Die wichtigsten git Kommandos
Neben den einzelnen Kommandos kann auch der Interactive Modus genützt werden mit zum Beispiel „git commit –interactive -m „My Git Test““
Neues Repository
Das git Repository liegt im Unterordner „.git“ des Projekt Verzeichnisses. Mit „git init“ wird das Repository angelegt.
# In das neue Projektverzeichnis wechseln git init Initialized empty Git repository in /srv/projectplan/.git/
Soll das Repository später verteilt werden besser gleich so anlegen:
git init --bare --shared
Datei Handling
Die Daten zum nächsten Commit hinzufügen und dann ein Commit mit Kommentar absetzen:
#add git add plan1.xer #add all new and changed files git add -A #check the Status git status #Commit git commit -m "Start Project" #show the last commit git show
Immer beachten dass nur die Dateien commited werden die im Status „Staged“ sich befinden, d.h. die in den git Index aufgenommen wurden. Wird eine Datei geändert, wird die geänderte Datei nicht automatisch aufgenommen, sondern muss dem git Index hinzugefügt werden. Will man das „git add“ auf jede geänderte Datei vermeiden, den commit mit der Option „-a“ absetzen.
Übersicht über den Status einer Datei in Git:
Dateien ausschließen mit einem „.gitignore“ im Wurzel/Stammpfad des neuen Projektes (Gute Beispiele siehe unter https://github.com/github/gitignore):
cd <root path of your project #Create first on windows touch .gitignore vi .gitignore #Ignore all tmp files *.tmp # but add this tmp file (overwrite rule 1) !myprojekt.tmp # ignore all files in the log directory log/ #Ignore all log file in directroy trace trace/**/*.log
Dateien von Platte und aus dem Repository löschen:
git rm <myilename> git status
Dateien nur aus dem Repository löschen (Daten bleiben auf Platten enthalten und können dann in .gitignore aufgenommen werden und nicht wieder neu eingecheckt zu werden) mit der Option „–cached“:
git rm --cached <myilename> git status
Dateien umbennenen oder verschieben
git mv <myilename> git status
Commit Handling
Den letzen Commit Kommentar bearbeiten:
git commit --amend
Dateien den letzen Commit hinzufügen:
git add <file_name> git commit --amend
Letze Änderung an einer Datei wieder rückgängig machen:
git reset Head <filename> git checkout HEAD <filename>
Alles wieder zurück setzen auf den letzten Commit im Master:
git reset --hard
⇒ Falls danach ein Undo notwendig wird ⇒https://stackoverflow.com/questions/5788037/recover-from-git-reset-hard/5788069
git reflog show git reset HEAD@{1} git push
Die letzen Commits anzeigen:
#All git log #Bessere Ausgabe git log --oneline #Formated git log --pretty=format:"%cd - %an - %s" #Last 9 commits git log --pretty=oneline -9 #last commit git show
Wer hat was an einer Datei geändert mit „git blame <filename>“
git blame readme.txt
Branch Handling und stash Funktionalität
Auf welchen Branch arbeite ich geraden:
git branch
Einen neuen Branch anlegen mit „git branch <branch_name>:
git branch branch_gpi
Auf den neuen Branch umschalten
git checkout branch_gpi # Daten ändern/hinzufügen git add -A git commit -m "start new branch" git status
Auf den alten Branch zurückschalten:
git checkout master git status
Unser Änderungen in den Master einarbeiten
git merge branch_gpi
Eine Branch löschen:
#wiht upper D also if not merged! git branch -D branch_gpi
Mit „stash“ kann der Inhalt der Working Directory auf einen „Stack“ gelegt werden und damit wird zum letzten Commit Punkt zurück gesprungen
git stash
Nun können Änderungen am letzen Release durchgeführt und später können die vorherigen Änderungen wieder eingearbeitet werden
„stack“ wieder einfügen:
git stash apply
HEAD anzeigen lassen auf welchen Branche das zeigt!
git symbolic-ref HEAD
Übersicht:
Eine gute Übersicht siehe auch hier ⇒ http://nvie.com/posts/a-successful-git-branching-model/
Mit Remote Repositories arbeiten
Es wird immer auf einer lokalen Kopie des Remote Repository gearbeitet.
Herunterladen und damit lokales Repository anlegen:
git clone https://github.com/git/git
Prüfen wie die URL lautet:
git remote -v
Aktuelle Version landen (Fetch), aber nicht mergen! Merge muss mit „git merge“ im Anschluss erfolgen!
git fetch #Bei Bedarf git merge
Update from global mit „git pull [remote-name]“, Merge mit der bestehenden Stand des lokalen Working Directory, wie ein „git fetch“ und ein „git merge“ zusammen
git pull
Meine Commits hochladen mit „git push [remote-name] [branch-name]“ :
git push
Auf Neues prüfen mit „git remote show [remote-name]“:
git remote show
Ein Repository lokal klonen
Als URL wird das Filesystem angegeben:
git clone file:///srv/projectplan/ projectplan02
Ein Repository über ssh klonen
git clone root@primaeppmp151:/srv/projectplan/ projectplan03
Ein Repository umziehen
Git Repository aus orginal Quelle clonen.
URL umsetzen
git remote rm origin git remote add origin https://gitxxxxxx.org/yyyyyy
Daten in das neue Repository übertragen:
git push -u origin --all
Das git Repository pflegen
Manuell die Maintenance auf dem Repository anstossen:
git gc
Wieviele Objekte:
git count-objects -v
Siehe auch ⇒ Git-Internals-Maintenance-and-Data-Recovery
Einen Git Patch erstellen
Mit einem Patch über Git werden alle Änderungen in eine Branch in eine Datei übernommen, diese Änderungen können dann in den Master eingespielt werden. Damit muss der Entwickler den Master nicht direkt „commiten“ kann aber seine Änderungsvorschläge an den Maintainer des Codes einfach als eine Datei senden. Der Maintainer kann dann diese Patch in den Master einspielen und diesen commiten.
Branch mit dem Bug Fix
Eine Patch mit allen Änderungen des aktuellen Branches gegenüber dem Master anlegen:
git format-patch master --stdout > fix_gpi.patch
Auf dem Master Branch Prüfen:
git apply --stat fix_gpi.patch git apply --check fix_gpi.patch
Einspielen:
#Apply mit Tag um später das besser nachvollziehen zu können git am --signoff < fix_gpi.patch
Übersicht über die wichtigsten Kommandos
Kommando | Bedeutung | Kommentar |
---|---|---|
git help <befehl> | Man Page zu dem Befehl anzeigen | - |
git init | Neues Repository anlegen | Im Wurzel/Stammpfad des neuen Projektes |
git clone https://<url to git repository> <new name> | Ein Repository clonen und mit neuen Namen anlegen | |
git fetch | Aktuellen Stand von remote laden | Aber nicht mergen! |
git pul | Aktuellen Stand von remote laden und mergen | - |
git push | Commit auf den Server puschen | - |
git add <file> | Datei hinzufügen | Auch mit * wie *.xer möglich |
git commit -am „Comment“ | Ein Commit durchführen | mit -m Kommentar hinterlegen, mit -a alle bekannten Dateien mit aufnehmen |
git add -A | Alle neuen Dateien im Baum zum nächsten Commit hinzufügen | - |
git status | Status der neuen/geänderten Dateien im Repository | Kurze Übersicht mit git status -s |
git diff | Alle Änderungen anzeigen | mit „git diff <dateiname> nur auf einer Datei |
git rm <file> | Eine Datei löschen | mit –cached Schalte Datei auf Platte belassen! |
git mv <file> | Eine Datei umbenennen oder verschieben | - |
git log | Historie anzeigen | mit Schalter die letzten Änderungen wie „git log -p -1“ oder formatieren mit git log –pretty=format:“%cd - %an - %s“ |
git show | Letzes Commit anzeigen | - |
git blame | Wer hast zuletzt in welcher Zeile des Codes die Änderung eingecheckt | wie git blame –date=format:%d.%m.%Y-%H:%M <Dateiname> mit angepassten Datumsformat |
git commit –amend | Den letzten Commit anpassen | Wenn sich nichts anders geändert hat nur den Kommentar anpassen |
git reset Head <filename> | Datei aus dem Index entfernen | Nicht mehr im Status „Staged“ |
git checkout HEAD <filename> | Datei mit der letzten Version vom letzten Commit überschreiben | - |
git gc | Git Repository „aufräumen“ | - |
Eine gute Zusammenfassung der git Befehle mit Beispielen ⇒ http://gitref.org/index.html
Der Git diff Befehl
Aufgabe: Alle Unterschied in einer Datei vom ersten Einchecken bis zum aktuellen Master aufzeigen un in einer Logdatei protokolleren.
git diff –outout=<dif_log_name> from..to filename :
git diff --output=dif.log fe145a7..HEAD /e/GPI/entwicklung/code/04-PLSQL/PKG_GPI.pkb
siehe auch ⇒https://www.git-tower.com/learn/git/ebook/en/command-line/advanced-topics/diffs/
Eine gelöschte Datei wieder herstellen
Mit „git show HEAD~<anzahl zurück>:<name der Datei>“ kann der Inhalt einer Datei aus einem der letzten Commits angezeigt werden. Damit läßt sich der Inhalt dann wieder rekonstruieren, ohne gleich den ganzen Source Code auf diesen Commit zurück setzen zu müssen.
Beispiel, vor 2 Commits war die Datei noch vorhanden, leider gelöscht und dann commited, nun wieder herstellen:
git show HEAD~2:install_ahf.yml > install_ahf.yml
Von Mercurial nach Git migrieren
Übersicht über die möglichen Werkzeuge ⇒ https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools#Mercurial
fast-export.git
Hooks verwenden um code zu deployen
Idee: Auf dem Server ein Git Repository anlegen, bei einem erfolgreichen Pull vom Master werden die Daten gleich verteilt ( ohne das .git directory !)
Hook anlegen in .git/hook Directory:
#!/bin/sh GIT_WORK_TREE=/c/work/server git checkout -f
siehe auch https://mikeeverhart.net/2013/01/using-git-to-deploy-code/
Einen Git Server aufsetzen
Ziel: Einen Git Server unter Linux mit einer komfortablen Weboberfläche aufsetzen
Übersicht über Web Interfaces für Git ⇒ https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Web_Interfaces
SSH nützen
Am einfachsten kann das SSH Protokoll für eine verteilte Git Umgebung eingesetzt werden. Dies ist zum Beispiel sehr praktisch um in einer Server Umgebung Konfigurationsdateien etc. über git zu verwalten.
Spezielle Firewall Regeln sind dann nicht notwendig, die bestehenden Wartungszugänge können genützt werden.
Auf einem zentralen Server das Repository leer anlegen
mkdir sqlscripts cd sqlscripts git init --bare --shared
Mit Dateien füllen und entsprechend die erste Version anlegen.
Die SSH Zugänge mit Keys hinterlegen (falls möglich siehe für die Keys SSH Key's verwenden
Das Repository kann nun über ssh auf die entsprechenden Server geklont werden
git clone root@primaeppmp151:/srv/sqlscripts/ sqlscripts
gitlab
Installationsanleitung und Download über https://about.gitlab.com/downloads/ oder mit dem https://bitnami.com/stack/gitlab/installer auf einen eigenen Server.
Anbinden an das AD ⇒ https://www.caseylabs.com/setup-gitlab-ce-with-active-directory-authentication/
Test mit einer virtuellen Maschine
Für einen ersten Test kann auch hier eine Virtuelle Maschine heruntergeladen werden ⇒ https://bitnami.com/stack/gitlab , bzw. https://bitnami.com/stack/gitlab/virtual-machine
Datei herunterladen und über VMWare Workstation die bitnami-gitlab-8.14.3-0-linux-ubuntu-14.04-x86_64.ova importieren, z.b. nach „R:\vmware\GITSRV01“ und die VM Appliance starten.
Der User heißt bitnami, Password bitnami, das Password muss beim ersten Login gesetzt werden.
System vorbereiten:
# Keyboard auf Deutsch sudo apt-get install console-common #Zeitzone setzen sudo dpkg-reconfigure tzdata # Vmware Tools apt-get install open-vm-tools
Leider liegt bei dieser Maschine nun ein Problem mit der Netzwerk Konfiguration vor, DHCP funktioniert nicht, sorgfältig VMWare Netzwerk Eigenschaften und Status der Netzwerkkarte überprüfen.
SSH einschalten:
$ sudo mv /etc/init/ssh.conf.back /etc/init/ssh.conf $ sudo start ssh
Aufruf der Weboberfläche über <ip-Adresse-der-appliance>:80 aufrufen und mit „user@example.com“ und Password „bitnami1“ anmelden und Konfiguration durchführen.
Weiter siehe http://git-scm.com/book/en/v2/Git-on-the-Server-GitLab
Wichtig! Passwörter sorgfältig ausschreiben! Nachträglich macht das sonst keinen Spass mehr .-(
Quellen
Quellen
Git
Übersicht:
Video Tutorials
Zwei Git Repository mergen
MS VSS zu Git migrieren
Git umziehen
Line Endings
Changing a remote's URL
Changing a commit message
Repostory Cleaner