=====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 => [[prod:oracle_primavera_archive_projekt_plan|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 == * https://git-scm.com/book/en/v2/Getting-Started-Installing-Git ---- ==== 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 * {{:prog:git_setup_windows10_v01.png?300|Git Components}} - Next * Selct Start Menu Folder - alles Default - git - Next * Adjust your PATH enviroment - alles Default * {{:prog:git_setup_windows10_v02.png?300|Git Path settings}} - Next * 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 - * {{:prog:git_setup_windows10_v03.png?300|Git Line ending}} - Next * 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 [[http://sourceforge.net/projects/mingw-w64/|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. {{ :prog:git_windows10_usage_v01.png?400 |Git unter Windows 10 - Kommando Shell starten}} 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 * https://www.sourcetreeapp.com/ Git-Client Tower * https://www.git-tower.com/windows Git Hub for Windows * https://desktop.github.com/ * Als Editor Atom verwenden https://atom.io/ oder https://code.visualstudio.com ---- ==== Scripten unter MS Windows ==== Alles einchecken cd cd 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 cd 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\) 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: {{ :prog:git_file_status_v01.png?650 | Git File status Overview }} Dateien ausschließen mit einem ".gitignore" im Wurzel/Stammpfad des neuen Projektes (Gute Beispiele siehe unter https://github.com/github/gitignore): cd Dateien von Platte und aus dem Repository löschen: git rm 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 git status Dateien umbennenen oder verschieben git mv git status ===Commit Handling=== Den letzen Commit Kommentar bearbeiten: git commit --amend Dateien den letzen Commit hinzufügen: git add git commit --amend Letze Änderung an einer Datei wieder rückgängig machen: git reset Head git checkout HEAD Alles wieder zurück setzen auf den letzten Commit im Master: !!!! alle Dateien die auf new File stehen werden gelöscht !!!!!! Müssen zuvor unstaged werden !!!!! 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 {{ :prog:git_file_status_v02.png?650 | Overview git rest}} 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 " 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 : 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: {{ :prog:git_branch_v01.png?550 | Git Branch and stash }} 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 Übersicht: {{ :prog:git_branch_remote_v01.png?550 |Git Remote}} ===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 => [[https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery | 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 | Man Page zu dem Befehl anzeigen|-| |git init| Neues Repository anlegen| Im Wurzel/Stammpfad des neuen Projektes| |git clone https:// | 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 | 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 nur auf einer Datei| |git rm |Eine Datei löschen | mit --cached Schalte Datei auf Platte belassen!| |git mv |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 mit angepassten Datumsformat| |git commit --amend| Den letzten Commit anpassen | Wenn sich nichts anders geändert hat nur den Kommentar anpassen| |git reset Head | Datei aus dem Index entfernen| Nicht mehr im Status "Staged"| |git checkout HEAD | 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= 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~:" 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 * https://hedonismbot.wordpress.com/2008/10/16/hg-fast-export-convert-mercurial-repositories-to-git-repositories/ * http://repo.or.cz/w/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 [[linux:vi#ssh_key_austausch|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 :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== * http://git-scm.com/book/en/v2/Git-on-the-Server-GitLab ---- ==== Quellen ==== Git * http://git-scm.com/doc * https://www.atlassian.com/git/tutorials/what-is-version-control Übersicht: * https://www.heise.de/developer/artikel/Die-vielfaeltigen-Faehigkeiten-von-Git-Teil-1-4456122.html * https://www.heise.de/developer/artikel/Die-vielfaeltigen-Faehigkeiten-von-Git-Teil-2-4476370.html Video Tutorials * https://www.youtube.com/watch?v=qh-R0-7Ii_U Zwei Git Repository mergen * https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history/ MS VSS zu Git migrieren * https://github.com/trevorr/vss2git Git umziehen * http://www.almguide.com/2016/02/10-steps-to-move-a-git-repo-from-github-to-visual-studio-team-services/ Line Endings * https://help.github.com/articles/dealing-with-line-endings/ Changing a remote's URL * https://help.github.com/articles/changing-a-remote-s-url/ Changing a commit message * https://help.github.com/articles/changing-a-commit-message/ Repostory Cleaner * https://rtyley.github.io/bfg-repo-cleaner/