7
Deutschland 9,80 Österreich 10,80, Schweiz sFr 19,20 5.13 www.eclipse - magazin.de ©iStockfoto.com/Kngkyle2 Neue Erweiterung für das große Git-Poster auf Seite 8! Alles im Browser: Orion 3.0 > 45 Neuling: BPM mit Eclipse Stardust > 50 Alle Infos zum Release Train > 26 Embedded Development > 92 Die beliebtesten Miniaturcomputer Open Source ALM > 101 JasForge und Eclipse Lyo SDK Eclipse-4- Migration > 14, 19 Zwei Erfahrungs- berichte News von den Java Development Tools > 36 ECLIPSE KEPLER Alle Infos im Heft >> 48, 51

Ecm 5 13_djaafar_jas_forge

Embed Size (px)

DESCRIPTION

Agility and OSLC with JasForge Project

Citation preview

Page 1: Ecm 5 13_djaafar_jas_forge

Deutschland ! 9,80Österreich ! 10,80, Schweiz sFr 19,20 5.13

www.eclipse-magazin.de

©iS

tock

foto

.com

/Kng

kyle

2

www.software-architecture-camp.de

Das erwartet Sie im Camp: Fundierte, praxisnahe und pragmatische Einführung in Soft-warearchitektur mit hohem Übungsanteil. Sie lernen und üben die vielfältigen Aufgaben von Softwarearchitekten anhand von Fallstudien. Der Fokus liegt auf methodischem und systema-tischem Vorgehen bei Architekturentwurf und -bewertung. Beide Trainer betreuen Sie im Camp als Team. Erleben Sie ein einzigartiges Training mit spannenden Diskussionen, tiefen Ein blicken und dem außergewöhnlichen Wissen von zwei der besten Softwarearchitektur-Experten!

8. – 11. Oktober 2013, Berlin

www.software-architecture-camp.dewww.software-architecture-camp.de

Dr. Gernot Starke

Phillip Ghadir

MMMMMMiiiiiitttttt ZZZZZZeeeeeerrrtttiiifififizzziiieeerrruuunnngggzzzuuummm

MMMiiitttZZZeeerrrtttiiifififi

zzziiieeerrruuu

nnngggzzzuuu

mmm Certifi ed Certifi ed Certifi ed

Professional Professional Professional

for Software for Software for Software

Architecture Architecture Architecture

iSAQB

Ihre

Tra

iner

Mit Zertifi zierung zum „Certifi ed Professional for Software Architecture“ (iSAQB)

Mit Termin - garantie!

Präsentiert von: in Kooperation mit: Media-Partner: Veranstalter:

Neue Erweiterung für das große Git-Poster auf Seite 8!

Alles im Browser: Orion 3.0 > 45

Neuling: BPM mit Eclipse Stardust > 50

Alle Infos zum Release Train > 26

Embedded Development > 92

Die beliebtesten Miniaturcomputer

Open Source ALM > 101

JasForge und Eclipse Lyo SDK

Eclipse-4-Migration > 14, 19

Zwei Erfahrungs-berichte

News von den Java Development Tools > 36

ECLIPSE KEPLER

Alle Infos im Heft

>> 48, 51

eclipse m

ag

az

in 5

.20

13

Page 2: Ecm 5 13_djaafar_jas_forge

101

ALMJasForge

www.eclipse-magazin.de eclipse magazin 5.13

von Karim Djaafar

JasForge [1] ist eine Kollaborations- und Agile-Platt-form zur Entwicklung und Integration von Agile-Tools in einem einzigen Dashboard. Das gemeinschaftlich vo-rangetriebene Projekt begann 2007 und wurde sukzessiv um verschiedene Komponenten erweitert: Subversion für Quellcodeverwaltung, Continuous Integration mit Hudson (später Jenkins), Sonar für die Verwaltung der Codequalität, JIRA für Fehlerverwaltung etc.

Für die Nutzerverwaltung verwendet JasForge eine Implementierung des LDAP-Registrys. Dabei werden drei Nutzerrollen unterstützt: Administratoren, Projekt-manager und Entwickler. Abbildung 1 zeigt die erhält-liche Version, die alle ALM-Suite-Tools darstellt und verwaltet.

Unter Verwendung des Ma-ven Archtype Wizards kann JasForge verschiedene Arten von Projekten erstellen, wie aus Abbildung 2 hervorgeht.

Es lassen sich viele verschie-dene Tools sowie Werkzeuge aus der Atlassian-Toolsuite verwalten (Abb. 3), so etwa das GreenHopper-Agile-Ma-nagement-Tool.

Von JasForge zur neuen JasForge-OSLC-Lyo-VersionBei JasForge verwenden wir die Lyo-OSLC-Implementie-rung. Hinter OSLC steht eine

offene Community, die Spezi!kationen für die Integra-tion von Werkzeugen erstellt. Diese Spezi!kationen er-möglichen es, Daten und Arbeitsabläufe entsprechender unabhängiger Software und Werkzeuge zur Verwaltung des Produktlebenszyklus zu integrieren, unterstützen also End-to-End-Lebenszyklusprozesse. Kurzum senkt die OSLC die Hürde für die Integration von Lifecycle-Tools.

Das Projekt Eclipse Lyo [2] begleitet die Aktivitäten der OSLC-Community, was die Spezi!kationen betrifft. Es stellt ein SDK zur Anwendung der OSLC-Spezi!ka-tionen zur Verfügung. Ziel ist es, die Verbreitung dieser Spezi!kationen voranzutreiben und der Eclipse-Commu-nity die Entwicklung von OSLC-konformen Tools zu er-leichtern. Außerdem stellt Lyo Entwicklern Beispielcode

Abb. 1: Alle verfügbaren ALM-Tools auf einen Blick

OSLC-Plug-in-Entwicklung mit JasForge und dem Eclipse Lyo SDK

Alles in einem Dashboard OSLC-(Open-Services-for-Lifecycle-Collaboration-)Spezi!kationen sollen die Integration von Life-cycle-Tools einfacher machen. Der folgende Beitrag beleuchtet JasForge, eine Open-Source-Agile-Plattform, die diesem Standard verp"ichtet ist. Gezeigt wird, wie man zu verschiedenen Stadien eines Projektlebenszyklus OSLC-konforme Werkzeuge integriert. Dazu werfen wir einen Blick auf die Geschichte und die ursprünglichen Ziele der JasForge-Community bis zur aktuellen Version, die das Eclipse Lyo SDK verwendet und mit OSLC-Standards somit vollständig kompatibel ist.

Page 3: Ecm 5 13_djaafar_jas_forge

102

JasForgeALM

www.eclipse-magazin.deeclipse magazin 5.13

als Orientierungshilfe zur Verfügung. Bevor wir uns die JasForge-/OSLC-Suite ansehen, werfen wir erst einen Blick auf einige grundlegende Konzepte der OSLC.

OSLC: KernkonzepteServiceProvider: Die OSLC de!nieren das Konzept des ServiceProviders, der es Produkten ermöglicht, Con-tainer oder Partitionen für die Integration zugänglich zu machen. Der ServiceProvider ist das zentrale Ord-nungsprinzip der OSLC. Durch ihn können Werk-zeuge Ressourcen zur Verfügung stellen und Nutzer zu allen Ressourcen navigieren sowie neue erstellen. ServiceProvider liefern Antworten auf zwei einfache Fragen:

An welche URLs muss ich neue Ressourcen senden (POST)?Woher bekomme ich eine Liste bestehender Ressour-cen (GET)?

Weitere Eigenschaften des ServiceProviders:

Alle OSLC-Ressourcen be!nden sich in einem Service-Provider. Je nach Bedarf kann jede OSLC-Ressource eine Eigenschaft besitzen, die angibt, in welchem Ser-viceProvider sie sich be!ndet.

Clients können auf die Liste an bestehenden Ressourcen in einem ServiceProvider zugreifen. Die einzige in OSLC de!nierte Möglichkeit, neue OSLC-Ressour-cen zu erstellen, ist, sie in einem ServiceProvider zu erzeugen – ent-weder direkt durch einen HTTP-POST oder durch einen Dialog.Ein ServiceProvider ist selbst eine OSLC-Ressource mit einem HTTP- URL.

Zwei grundlegende Eigenschaften ei-nes ServiceProviders sind:

oslc:creation: der URL einer Res-source, an den man Repräsenta-tionen schicken kann, um neue Ressourcen zu erzeugen.oslc:queryBase: der URL einer Ressource, auf den man per GET zugreifen kann, um eine Liste an bestehenden Ressourcen im Ser-viceProvider zu erhalten. Der URL wird „queryBase URL“ genannt, und die Ressource, die von diesem URL identi!ziert wird, nennt sich queryBase.

Creation Factories: Um eine neue OSLC-Ressource zu erzeugen, muss

ein OSLC-Client per POST eine Repräsentation dieser Ressource an den Creation-URI der Creation Factory senden:

Ein HTTP-POST eines Inhalts an einen Creation-URI löst im Normalfall die Erstellung einer neuen Ressour-ce aus; konnte die Erstellung nicht erfolgen, erhält man über den entsprechenden HTTP-Statuscode eine Erklärung. Die Antwort auf einen erfolgreichen HTTP-POST an einen Creation-URI enthält normalerweise einen HTTP Location Header, der den URI der neu erzeug-ten Ressource enthält.

Query-Fähigkeiten: Ein OSLC-Service kann eine oder mehrere Query-Fähigkeiten bereitstellen, um Res-sourcen zu durchsuchen. Eine Query-Fähigkeit stellt einen Base-URI für Query-Resource-URIs zur Verfü-gung, optional auch Resource Shapes, die die Wer-te der Eigenschaften beschreiben, welche in den zu durchsuchenden Ressourcen zu erwarten sind. Durch Query-Fähigkeiten lassen sich also die Ressourcen aus!ndig machen, die von einem OSLC-Service ver-waltet werden.

RDF: REST und Linked Data sind die Hauptimple-mentierungen, auf die sich das Kernteam geeinigt hat.

Abb. 2: Projekterstellung

Abb 3: Toolverwaltung

Page 4: Ecm 5 13_djaafar_jas_forge

103

ALMJasForge

www.eclipse-magazin.de eclipse magazin 5.13

OSLC de!nieren Ressour-cen durch URLs, die dann durch HTTP-Methoden verändert werden kön-nen. Ressourcen in OSLC bestehen oft aus Daten über gängige Konzepte in ALM-Software, z. B. Bugs (im OSLC-Vokabular: Change Requests).

OSLC-Daten werden durch das RDF (Resource Description Framework) repräsentiert, durch das Softwarehersteller auf einfache Art und Weise spezielle Erweiterungen zu den Daten hinzufügen können, die von ihrer OSLC-API-Implementierung be-reitgestellt werden. OSLC-Services müssen RDF/XML-Repräsentationen produzieren und konsumieren. OSLC de!niert nur begrenzt Daten, die über eine bestimmte Ressource zur Verfügung gestellt werden müssen.

JasForge OSLC: Überblick und ArchitekturJasForge OSLC ist eine Prototypversion. Sie integriert das Open-Source-Tool Bugzilla, mit dem sich Änderungen verfolgen lassen, mit der Codeverwaltung von Subversi-on. Die Nutzerverwaltung basiert auf OpenLDAP, so wie die JasForge-Community und -Produktversion [1]. Die JasForge-Architektur besteht aus vier Bausteinen:

JasForge Model: das Hauptmodul, das alle Kernenti-täten der Datenbank de!niert

Listing 1@Service("svnServiceProviderCatalog")public class SvnServiceProviderCatalog implements ISvnServiceProviderCatalog {

private static Class<?>[] RESOURCE_CLASSES = { ManageReposOslcBean.class }; public ServiceProvider createServiceProvider(String baseURI, String URIOslc) throws OslcCoreApplicationException, URISyntaxException { final ServiceProvider serviceProvider = ServiceProviderFactory. createServiceProvider( URIOslc, baseURI, "ManageSVN", "Service provider for jasforge tools : SVN " , null, RESOURCE_CLASSES, null);

return serviceProvider; }

public ServiceProviderCatalog getServiceProviderCatalog(String baseURI, String URIOslc) throws OslcCoreApplicationException, URISyntaxException{ ServiceProviderCatalog serviceProviderCatalog = new ServiceProviderCatalog(); ServiceProvider serviceProvider = createServiceProvider(baseURI, URIOslc) ;

serviceProviderCatalog.addServiceProvider(serviceProvider); serviceProviderCatalog.setTitle("Jasforge OSLC Service Provider Catalog for SVN"); serviceProviderCatalog.setDescription("Jasforge OSLC Service Provider Catalog contenant l'ensemble des services offerts pour SVN"); serviceProviderCatalog.setPublisher(new Publisher("JasmineConseil", "com.jasmineconseil.jasforge")); try { serviceProviderCatalog.getPublisher().setIcon(new URI("http://jasforge.com/resources/img/logo-jasforge.gif")); } catch (URISyntaxException e) { e.printStackTrace(); }

return serviceProviderCatalog; }}

Abb. 4: Die Architektur im Detail

Abb. 5: Die JasForge-Begrüßungsseite

Page 5: Ecm 5 13_djaafar_jas_forge

104

JasForgeALM

www.eclipse-magazin.deeclipse magazin 5.13

JasForge Service: das Kernstück der Anwendung, es enthält: y DAO-Interfaces, die die Art des Zugangs zu den Da-ten bestimmen

y Den Maven-Service, der die von JasForge vorge-schlagenen Maven-Services zur Verfügung stellt

y LDAP-Service: ein Modul, das Nutzerrollen mithilfe der LDAP-Registry verwaltet

JasForge-Plug-in: enthält alle JasForge-Plug-ins, die die von JasForge unterstützten OSLC-kompatiblen Tools de!nieren; momentan unterstützen wir Sub-version, Bugzilla (s. o.) und Nexus als Repository-Verwaltungswerkzeug; weitere Tools wurden von der Open-Source-Community vorgeschlagen, die das Jas-Forge-Ökosystem bereichern sollen [1]; das JasForge-Plug-in besteht aus: y dem ServiceProviderCatalog, der alle durch das Tool zur Verfügung gestellten ServiceProvider aufführt

y dem ServiceProvider (s. o.) y den Services, die das Plug-in anbietet: Creation Fac-tory (zur Erstellung einer neuen Ressource mithilfe eines spezi!zierten URI), Query-Fähigkeit, Crea-tion-Dialog (Ressourcenerzeugung mi thilfe einer Dialogbox) und Auswahldialog zur Auswahl einer

Abb. 6: Plug-in-Verwaltung

Listing 3@OslcCreationFactory ( title = "Svn repository Creation Factory", label = "Svn repository Creation", resourceShapes = {OslcConstants.PATH_RESOURCE_SHAPES + "/" + ConstantsOslc.PATH_CHANGE_REQUEST}, resourceTypes = {ConstantsOslc.TYPE_CHANGE_REQUEST}, usages = {OslcConstants.OSLC_USAGE_DEFAULT} ) @POST @Path("/createReposSvn") @Consumes({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType. APPLICATION_XML, OslcMediaType.APPLICATION_JSON}) @Produces({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON})// Create Subversion repository

public Response createRepos(RepositoryCM reposCM) throws URISyntaxException{

Response builder =null; User u = userService.findUserByUsername(reposCM.getCreatedBy()).get(0); String createur = u.getFirstname() + " " + u.getLastname(); log.debug("name repos" + reposCM.getTitle() + "createur" + createur);

if (validatePathrepo(reposCM.getPath(),reposCM.getIpMachine())) { log.debug("path" + reposCM.getPath()); log.debug("name repos" + reposCM.getTitle()); Repository reposInsert = new Repository(); Server server = new Server(); server.setIpMachine(reposCM.getIpMachine().trim()); }// to be completed return builder; }

Listing 2@GET@Path("/repo/{reposId}")@Produces({OslcMediaType.APPLICATION_RDF_XML, OslcMediaType.APPLICATION_XML, OslcMediaType.APPLICATION_JSON})public RepositoryCM myRepos(@PathParam("reposId") Integer reposId){

RepositoryCM repos = new RepositoryCM(); log.info("test myRepos"); try { Repository rep = repositoryService.findRepositoryById(reposId); repos = RepositoryCM.fromRepository(rep); } catch (IllegalParameterException e) { e.printStackTrace(); } catch (DataSourceException e) { e.printStackTrace(); } log.info("test fin myRepos"); return repos; }

Page 6: Ecm 5 13_djaafar_jas_forge

105

ALMJasForge

www.eclipse-magazin.de eclipse magazin 5.13

Abb. 7: Subversion-Plug-in

Abb. 8: Bugzilla-Plug-in

Ressource. Weitere Informationen kön-nen [3] entnommen werden.

JasForge Web: de!niert das Web Part der An-wendung mithilfe des Spring Frameworks.

Abbildung 4 zeigt die Architektur der JasForge-OSLC-Toolsuite im Detail.

JasForge OSLC in AktionSehen wir uns das JasForge-OSLC-Tool genauer an. Abbildung 5 zeigt die Begrüßungsseite des Projekts.

JasForge OSLC stellt ein Modul zur Verwal-tung aller OSLC-kompatiblen Plug-ins bereit (in der Plug-in-Verwaltung, Abb. 6).

Abbildung 7 zeigt ein Subversion-kompatibles Plug-in, das die Liste verfügbarer Subversion-Repositories anzeigt.

In Abbildung 8 ist das Bugzilla-Plug-in zu sehen, das Bugs anzeigt und ab der JasForge-OSLC-Version 2.0.4 unterstützt wird. Dieses Plug-in besteht haupt-sächlich aus einem AJAX-Mashup-OSLC-CM-Consu-mer, den wir mit jQuery entwickelt haben.

Um unsere Tour durch die JasForge-OSLC-Lyo-Tool-suite abzuschließen, zeigen wir in Listing 1 einen Auszug aus dem Code, der den Einsatz des OSLC ServiceProvi-ders verdeutlicht.

Java-Methoden, die Subversion-Services entsprechen, wie z. B. Repository-Management, werden mit JAX-RS-Annotationen versehen. So verwenden wir in Listing 2 beispielsweise HTTP GET, um Subversion-Repositories zu verwalten (man beachte hier die Verwendung der GET REST-Methode, die RDF XML und JSON unter-stützt).

Nun verwenden wir die HTTP-POST-Methode, um Repositories herzustellen (Listing 3).

ZusammenfassungDiese Tour durch die JasForge-OSLC-Lösung konnte Ihnen hoffentlich einen ersten Einblick in diese neue und spannende Technologie vermitteln, die die OSLC zur Integration und Verwaltung von ALM-Tools bieten.

Eine Demo steht unter [4] bereit. Besuchen Sie unsere Seite und beteiligen Sie sich am Aufbau der JasForge-Plattform. Viel Spaß dabei!

Aus dem Englischen von der Redaktion des Eclipse Magazins.

Karim Djaafar ist CO von Jasmine CONSEIL, einem französischen Unternehmen und Eclipse-Solutions-Mitglied, das sich agiler Ent-wicklung und Java-EE-Expertise verschrieben hat. Er verfügt über einen breiten Erfahrungsschatz in den Themen Java-EE-Entwicklung und Agile Coaching, kann auf über zwanzig Jahre Erfahrung in

Enterprise-Anwendungsentwicklung, IT-Management zurückblicken und ist Autor zahlreicher Bücher zu Eclipse und JBoss.

Links & Literatur

[1] http://www.jasforge.com

[2] http://eclipse.org/lyo

[3] http://open-services.net/bin/view/Main/OslcCoreSpeci!cation

[4] http://jasforge.com/jasforge2-test/login.xhtml

Page 7: Ecm 5 13_djaafar_jas_forge

w

Aktuelle Shortcuts:twitter.com/entwicklerpress

facebook.com/entwicklerpress

blog.entwickler-press.de

Stefan Zörner

LDAP für Java-EntwicklerEinstieg und Integration

240 Seiten, 2013

PRINT ISBN: 978-3-86802-094-6 Preis: 29,90 € / 30,80 € (A)

PDF ISBN: 978-3-86802-282-7 Preis: 17,99 €

EPUB ISBN: 978-3-86802-618-4 Preis: 17,99 €

Neu!

Beste Bücher für besten Code!

In vielen Unternehmen haben Verzeichnisse zur Speicherung und Bereitstellung von Informationen eine strategische Bedeutung. Vorherrschender Zugriffsmechanismus auf Verzeichnisdienste ist das Lightweight Directory Access Protocol (LDAP). In diesem Buch wird Java-Entwicklern auf kompakte und praxisnahe Weise das Rüstzeug vermittelt, um im Projektalltag Verzeichnisdienste in ihre Lösungen zu integrieren. Der Autor ist sowohl in der Java- als auch in der LDAP-Welt heimisch und bringt seine langjährigen Praxiserfahrungen zu beiden Technologien ein. Das erfolgreiche Buch liegt jetzt in der vierten Aufl age vor.

Die Referenz seit 2004!

www.entwickler-press.de/LDAP

Alle Printausgaben frei Haus erhalten Intellibook-ID kostenlos anfordern(www.intellibook.de)

Mit der Intellibook-ID kostenlos in der App anmelden und Zugriff auf alle Ausgaben des Eclipse Magazins erhalten (+ Bonusinhalte!)

ECLIPSE3

Jetzt 3 Top-Vorteile sichern!

1

Mit der Intellibook-ID kostenlos in der App 2

Zugriff auf das komplette PDF-Archiv mit der Intellibook-ID

3

ECLIPSEECLIPSEJetzt 3 Top-Vorteile sichern!

Jetzt abonnieren!

www.eclipsemagazin.de

Bjørn Stachmann, etracker GmbH

Feature Branches reviewen

Wenn man im Team mit Feature Branches arbeitet, möchte

man oft wissen, was auf den einzelnen Branches passiert ist.

*Fast-Forward Merges* erschweren das leider. Git erspart sich

dabei ein Merge Commit, wenn es genügt, den Branch-Zeiger

auf ein nachfolgendes Commit vorzurücken. Der Nachteil:

Man sieht nicht mehr, woher die Änderungen gekommen sind

oder ob überhaupt ein Merge stattgefunden hat. Ich empfehle

deshalb *Fast Forwards* abzuschalten:

JLW�FRQºJ���

JOREDO�PHUJH

�Ҭ�IDOVH

Die *First-Parent History*, bei der man immer nur den ers ten

Vorgänger eines Commits betrachtet, zeigt uns, welche Ände-

rungen per Commit direkt auf dem Branch getätigt und wel-

che per Merge von anderen Branches dazugeholt wurden:

JLW�ORJ���ºU

VW�SDUHQW�PD

VWHU��IHDWXU

H

Bei Reviews möchte man oft nur jene Änderungen betrachten,

die direkt auf diesen Feature Branches durchgeführt wurden.

Dann blendet man die Merges aus:

JLW�ORJ���ºU

VW�SDUHQW���

QR�PHUJHV��

PDVWHU��IHDW

XUH

Tobias Bayer, inovex

Tipp für Kommandozeilen-Aficionados

Ich habe diese beiden Aliasse in meiner config:

JUDSK� �ORJ�

��JUDSK�

��SUHWW\ IRU

PDW��&UHG�K

�&UHVHW�

���&�\H

OORZ��G�&UHV

HW��V��&JUHH

Q��FU��

� �&�EROG�EOXH

���DQ!�&UHVH

W���DEEUHY�

FRPPLW�

��GDWH UHODW

LYH

GDLO\� �ORJ�

��VLQFH���G

D\�DJR���RQ

HOLQH�

��DXWKRU�WRE

LDV�ED\HU#LQ

RYH[�GH

Der erste zeigt einen schönen Graphen auf der Kommando-

zeile und der zweite sagt mir, was ich im Daily zu erzählen

habe.

Tim Berglund, GitHub

Git Log

Das Command git log bringt eine einschüchternd große

Anzahl an Optionen mit sich. Viele Git-User reagieren auf diese

Komplexität, indem sie nur die einfachste Einsatzmöglichkeit

in Anspruch nehmen. Andere tauschen die Kommandozeile

gegen grafische Tools ein, sobald sie sich eine komplexe

Repository History anzeigen lassen wollen. Obwohl nichts

Verkehrtes daran ist, ein Git-GUI zu verwenden – mir gefallen

http://mac.github.com und http://windows.github.com

besonders gut –, sollten Git-User in der Lage sein, die History

von der Kommandozeile aus zu sehen, wenn ihnen das lieber

ist. Es gibt vier Kommandozeilen-Log-Schalter, die dies

ermöglichen:

JLW�ORJ���JU

DSK���RQHOLQ

H���GHFRUDWH

��DOO

--graph sorgt dafür, dass der Log den Repository-Graphen mit

ASCII-Art zeichnet, was besser funktioniert, als man vermuten

würde. --oneline bricht die Ausgabe jedes Commits auf eine

einzige Zeile mit verkürztem Commit Hash herunter. --decorate

versieht jeden Commit mit jedem verfügbaren Branch- oder

Tag-Namen. --all sorgt dafür, dass der Log die Commits aller

Branches anzeigt, nicht nur die des aktuellen.

Dieses Command ist natürlich etwas sperrig. Man sollte also

ggf. einen Alias erzeugen – siehe dazu folgenden Tipp von

Artur Speth.

Artur Speth, Microsoft

Aliasse

Aliasse sind nützlich, wenn man Befehle in Git abkürzen

möchte. Zum Beispiel bekommt man mit dem Befehl git diff

--cached die staged-Änderungen. Dafür kann ich mir einen

Alias einrichten.

Mit git config --global alias.staged 'diff --cached' habe ich nun

einen einfachen Zugriff auf den Befehl mittels git staged.

Christian Janz , BridgingIT

Änderungen mit „git stash“ parken

Wer kennt das nicht? Während der Entwicklung eines neuen

Features muss dringend ein Fehler gefixt werden. Was aber

passiert mit den gemachten Änderungen? Hier schafft git

stash Abhilfe: Damit wird der aktuelle Zustand von Arbeits-

verzeichnis und Index gesichert und das Arbeitsverzeichnis

auf den HEAD Commit zurückgesetzt. Von dort kann nun in

den Release Branch gewechselt werden, um dort den Fehler

zu beheben. Danach integriert git stash pop die anfangs

gemachten Änderungen für das neue Feature wieder in das

Arbeitsverzeichnis. Eclipse unterstützt dieses Feature auch

seit EGit 2.0.

Dominik Schadow, BridgingIT

Ein Git Repository in ein anderes kopieren

Mit wenigen Schritten lässt sich ein Git Repository inkl.

Historie und Autoren in ein bereits vorhandenes kopieren.

Der folgende Tipp zeigt dies mit dem master Branch eines

Repositorys:

Das Ziel-Repository normal klonen oder erstellen

git remote add -f [remote name] [repo url]

integriert das zweite Repository

git merge -s ours --no-commit [remote name]/master

führt Änderungen ohne Commit zusammen, wobei im

Konfliktfall das Ziel-Repository gewinnt

git read-tree --prefix=[local path] -u [remote name]/

master. integriert alle Commits in den angegebenen Pfad

git commit und git push

Änderungen übertragen

Michael Johann, Eco Novum GmbH

Statusanzeige im Prompt

Auf welchem Branch befinde ich mich, und welchen Status hat

er? Ist das Arbeitsverzeichnis des aktuellen Branches zwischen-

zeitlich verändert („dirty“) worden? Diese Frage taucht bei

einem Entwickler unter Nutzung eines Versionskontrollsystems

genauso häufig auf wie der Befehl „ls“ (list) in einer Shell, um

sich den Inhalt des Dateisystems anzeigen zu lassen. Die fol-

genden Zeilen, eingebunden in das Shell-Skript (z. B.: ~/.bash_

profile), halten uns immer bequem auf dem Laufenden:

IXQFWLRQ�JLW

BGHOHWHG�^

��>>���JLW�V

WDWXV��!��GH

Y�QXOO�_�JUH

S�

GHOHWHG����

����@@��HF

KR����

}IXQFWL

RQ�JLWBDGGHG

�^

��>>���JLW�V

WDWXV��!��GH

Y�QXOO�_�JUH

S�

��8QWUD

FNHG�ºOHV���

�� ����@@�

�HFKR�°�±

}IXQFWL

RQ�JLWBPRGLº

HG�^

��>>���JLW�V

WDWXV��!��GH

Y�QXOO�_�JUH

S�

PRGLºHG����

����@@��HF

KR�� �

}IXQFWL

RQ�JLWBGLUW\

�^

��HFKR����JL

WBDGGHG���JL

WBPRGLºHG���

JLWB

GHOHWHG��

}IXQFWL

RQ�JLWBEUDQF

K�^

��JLW�EUDQFK

���QR�FRORU�

�!��GHY�QXOO

�_�VHG��H

� ��A>A @�G�

�H��V� �?��

?��>?���JLWB

GLUW\�@��

}H[SRUW

�36� ?Z��JL

WBEUDQFK���

Im Wesentlichen zeigen die Funktionen drei Zustände an:

Wurden Dateien gelöscht? Dann wird ein Minuszeichen

ans Ende des Prompts angehängt.

Wurden Dateien verändert? In diesem Fall zeigt ein Stern-

symbol die Änderung an.

Wurden Dateien hinzugefügt? Der Status wird dann durch

ein Pluszeichen signalisiert.

Sollten Sie ein Linux betreiben, das deutschsprachige Ausgaben

erzeugt, sollten Sie die Zeichenketten bei den grep-Befehlen

entsprechend durch die zu erwartenden Worte ersetzen.

Martin Dilger, Freiberuflicher

Softwareconsultant und -trainer

Rebase

�JLW�UHEDVH�

�L�+($'a�$Q]

DKO�FRPPLWV!

Mit einem Interactive Rebase lässt sich wortwörtlich

Geschichte schreiben. Git ermöglicht es, bereits getätigte

Commits im Nachhinein (solange sie noch nicht gepusht sind)

zu bearbeiten, zusammenzufassen, zu vereinfachen und zu

veredeln. HEAD bezeichnet den zuletzt getätigten Commit

auf einem Branch.

~ <Anzahl Commits> beschreibt die Anzahl an Commits, die

vom obersten Commit aus bearbeitet werden sollen.

SLFN��������

�FRPPLW��

U���FҬH��FRP

PLW��

V����E�E��FR

PPLW��

I���JGE�V�FR

PPLW��

Die Standardauswahl ist pick oder p. Sie bewirkt, dass

Commit 1 unverändert bleibt.

Mit reword oder r lässt sich im Nachhinein die Commit

Message verändern.

Mit squash oder s wie bei Commit 3 würde er nach dem

Rebase mit Commit 2 verschmelzen. Seine Commit

Message bleibt erhalten.

Von mir persönlich mit Abstand am häufigsten

verwendet wird fixup oder f wie Commit 4. Dieser

Commit würde vollständig mit Commit 3 verschmelzen.

Git arbeitet von unten nach oben.

Interactive Rebase ist das Tool der Wahl, um Commits sauber

zu strukturieren.

Mario Konrad, bbv Software Services

Git Reset

Haben Sie in Ihrem Repository einen Commit, den Sie löschen

möchten, oder wollen Sie den HEAD auf einen bestimmten

Commit zurücksetzen, so können Sie mit Git die Geschichte

Ihres Repositorys nachträglich verändern.

Die letzten zwei Commits aus dem Repository unwider ruflich

löschen:

JLW�UHVHW���

KDUG�+($'a�

Auf die gleiche Weise ist es auch möglich, den HEAD auf einen

bestimmten Commit zu legen:

JLW�UHVHW���

KDUG�

��F��D�

��DG����IG��

DH��HD�IEE��

����H��HI�

Wurde beim letzten Commit etwas vergessen oder es hat sich

bei der Commit Message ein Fehler eingeschlichen, ist git-

reset sehr hilfreich:

JLW�UHVHW���

VRIW�+($'A

���

JLW�FRPPLW��

D��P��FRPPLW

�PHVVDJH�

Sie möchten den letzten pull oder merge rückgängig machen?

Kein Problem:

JLW�SXOO

���

JLW�UHVHW���

KDUG

Haben Sie eine Änderung bereits in ein remote Repository

gepusht, dann müssen Sie den Reset des HEADs mit force auf

das remote Repository pushen:

JLW�UHVHW���

KDUG�+($'A

JLW�SXVK���I

RUFH�RULJLQ�

PDVWHU

Bei Ihrer aktuellen Arbeit wollen Sie Änderungen eines Files

verwerfen, nicht jedoch die Arbeit an anderen Files beein-

trächtigen. Diese Aktion wird nicht mit git-reset durchgeführt,

sondern mit checkout:

JLW�FKHFNRXW

����ºOH�W[W

Achtung: Seien Sie vorsichtig mit git-reset, Sie können so

Ihr Repository permanent beschädigen.

René Preißel, eToSquare

Subtree-Befehl

Submodule bedeuten meist viele fehleranfällige Schritte.

Da kommt der subtree-Befehl wesentlich einfacher daher.

Auch mit ihm kann man ein externes Repository einbinden,

z. B. den Branch master des HTML5-Boilerplate-Projekts:

JLW�VXEWUHH�

DGG���SUHº[�

KWPO��ERLOHU

SODWH�?

������������

������VTXDVK

�KWWSV���JLW

KXE�FRP�

K�ES�KWPO��E

RLOHUSODWH�J

LW�PDVWHU

Im Gegensatz zu Submodulen werden dabei aber alle Dateien

in das aktuelle Repository importiert. Das weitere Arbeiten

bedarf keiner besonderen Schritte. Das Aktualisieren auf

einen neueren Stand ist ein einzelner Befehl:

JLW�VXEWUHH�

SXOO���SUHº[

�KWPO��ERLOH

USODWH�?

������������

�������VTXDV

K�KWWSV���JL

WKXE�FRP�

K�ES�KWPO��E

RLOHUSODWH�J

LW�PDVWHU

Änderungen im Unterprojekt können auch wieder in das

externe Repository zurückübertragen werden (split-Befehl).

Mein Tipp: Vermeiden Sie Submodule und nehmen Sie besser

den subtree-Befehl.

1) Lifecycle einer Git-Datei

untracked: noch nicht versioniert

unmodified: versioniert, aber noch nicht verändert

modified: verändert, aber noch nicht im Stage

staged: kann committet werden

2) Ein lokales Repository besteht aus:

Working Directory/Arbeitskopie: erste Station für ausgecheckte Dateien

Staging Area/Index: zweite Station, enthält die ausgecheckten und

bearbeiteten Dateien, die im nächsten Schritt zu einem Branch in einem

Repository hinzugefügt werden sollen

HEAD: verweist auf den letzten Commit im aktuellen Branch

3) Git Commands

Neues lokales Repository von bestehender Arbeitskopie anlegen

git init

Neues Repository ohne Arbeitskopie anlegen

JLW�LQLW���E

DUH

Repository klonen und Arbeitskopie auschecken

Arbeitskopie erstellen

JLW�FORQH��S

IDG���������

>]LHOSIDG@

Bei Verwendung eines entfernten Repositorys

�JLW�FORQH�>S

URWRFRO���@>

EHQXW]HUQDPH

#KRVW�@�SIDG

���������

>]LHOSIDG@

����(V�JHQ�JW

��KLHU�HLQHQ

�J�OWLJHQ�85

/�DQ]XJHEHQ�

���%HQXW]HUQ

DPH��=LHOISD

G�XQG�GDV�3U

RWRNROO�VLQG

�RSWLRQDO�

����0|JOLFKH�

:HUWH�I�U�GD

V�3URWRNROO�

�KWWS���KWWS

V���VVK�

���RGHU�JLW

Add & Commit

Änderungen der Staging Area/Index hinzufügen

JLW�DGG��GDW

HLQDPH!

JLW�DGG�

�JLW�DGG�����

�5HNXUVLY��Q

LPPW�DOOH�9H

U]HLFKQLVVH�

XQG

� � ������8QWHUY

HU]HLFKQLVVH

�PLW�LQ�GHQ�

,QGH[

Bestätigen der Änderungen in der Staging Area/Index

JLW�FRPPLW��

P��&RPPLW�1D

FKULFKW�

�JLW�FRPPLW��

DP��&RPPLW�1

DFKULFKW����

��D�I�JW�DOO

H�

���bQGHUXQJH

Q�DQ�'DWHLHQ

�KLQ]X��GLH�

EHUHLWV�JHWU

DFNW�

���ZHUGHQ��'

DPLW�VSDUW�P

DQ�VLFK�HLQ�

JLW�DGG��GDW

HLQDPH!

––> Änderung in HEAD

Änderungen in entferntes Repository hochladen

JLW�SXVK�RUL

JLQ�PDVWHU

master kann durch beliebigen anderen existierenden Branch im origin

ersetzt werden.

Lokales Repository ist nicht von entferntem geklont worden,

soll aber mit einem anderen Repository verbunden werden

JLW�UHPRWH�D

GG�RULJLQ��U

HSRVLWRU\�XU

O!

Branching Commands

Zu einem neuen Branch (feature_branch) wechseln

JLW�FKHFNRXW

�¬E�IHDWXUHB

EUDQFK

Zurück zum Master

JLW�FKHFNRXW

�PDVWHU

Neuen Branch löschen

JLW�EUDQFK�¬

G�IHDWXUHBEU

DQFK

Mergen und Aktualisieren

Neueste Änderungen in aktuellen Branch des lokalen Repositorys

übernehmen

JLW�SXOO�RUL

JLQ�PDVWHU

Branch mit einem anderen Branch zusammenführen

JLW�PHUJH��E

UDQFK!

Zusammenführen von Änderungen

JLW�DGG��GDW

HLQDPH!

Differenzen zwischen Branches anzeigen

JLW�GLҬ��TXH

OOEUDQFK!��]

LHOEUDQFK!

Änderungen der Staging Area/Index im Vergleich zum letzten

Commit anzeigen

JLW�GLҬ

Tagging

Neuen Tag erstellen (z. B. v0.1)

JLW�WDJ�Y���

�>�FRPPLW�,'

!@

Neuen kommentierten Tag erstellen (z. B. v0.1)

JLW�WDJ��D�Y

�����P�0HLQ

H�9HUVLRQ���

Liste der referenzierbaren Commit-IDs

JLW�ORJ

Änderungen rückgängig machen

Lokale Änderungen auf letzten Stand in HEAD zurücksetzen

JLW�FKHFNRXW

�����GDWHLQD

PH!

Änderungen komplett verwerfen

Zum Thema „Änderungen verwerfen“ finden Sie in der Sektion

10 Profitipps umfangreiche Tipps von Mario Konrad.

10 Profitipps

Commands

Sponsored by

Presented by:

master

Initial

Tag #0.1

Tag #1.0

#1.0 startet

Tag #1.1

Release

Hotfix

Feature

Zeit

Feature

development

Feature 1

für das aktuelle Release

für das nächste Release

Feature 3

Feature 2

Workflow

Der komplette Git-Workflow

1. Main Branches

Es gibt verschiedene Varianten, ein Git-Projekt zu beginnen.

Der folgende Beispielworkflow beginnt mit zwei Main

Branches:

Master Branch (master)

Development Branch (development)

Beide Main Branches sind von unbegrenzter Dauer.

Die initiale Produktversion startet auf dem Branch master und

wird im Branch development reflektiert. Im Branch master wird

der Sourcecode von HEAD stets im produktionsfertigen Status

angezeigt.

Im Branch development wird der Sourcecode von HEAD stets

mit den letzten Änderungen für das nächste Release angezeigt.

Gut zu wissen!

Eine andere, durchaus verbreitete Workflowvariante wäre,

dass konstant auf dem Master Branch gearbeitet wird. Die

hier gezeigte Variante trägt durch ihre Aufteilung aber zum

besseren Verständnis der einzelnen Workflowschritte bei.

2. Releases

Wenn der Sourcecode in development einen stabilen Status

erreicht hat und bereit ist, ausgeliefert zu werden, wird er

mittels eines Merge in den Branch master überführt und mit

einer Releasenummer ausgezeichnet.

IMMER wenn Änderungen in den Branch master gemergt

werden, haben wir per Definition ein neues Produktions-

release (dazu mehr in „Einen Release Branch erstellen“).

3. Supporting Branches

Supporting Branches erleichtern das parallele Arbeiten der

Teammitglieder. Man unterscheidet Feature Branch, Release

Branch und Hotfix Branch.

Feature Branch

Der Feature Branch dient dem Tracking der einzelnen

Features: Es gibt u. U. mehrere parallele Feature Branches (je-

weils einen Branch pro Feature). Ein Feature Branch existiert,

solange das Feature in der Entwicklungsphase ist. Dann wird

das Feature in den Branch development überführt (merge),

sodass es in das nächste Release ein gefügt werden kann. Das

Feature wird dann wiederum vom Branch development in den

Branch master gemergt.

Gut zu wissen!

Branch Naming Convention bei Feature Branches: Alles ist

erlaubt, außer master, development, release-* und hotfix-*.

Bei der Verwendung spezifischer Software, wie etwa JIRA,

erfolgt die Benennung der Branches üblicherweise nach

den Issue-IDs.

Release Branch (release-*)

Der Release Branch dient der Vorbereitung für das

Production-Release: Kurzfristige Überprüfungen des

Releasecodes werden auf einen Release Branch gelegt.

Hier können schnelle Bug Fixes (geringerer Form)

gemacht und Metadaten für das nächste Release vor-

bereitet werden. Somit bleibt der Branch development

frei, um weiterhin Features zu mergen. Der Release

Branch wird nach Abschluss eines Fixes/der Vorberei-

tung aufgelöst. Zuvor wird er sowohl in development

als auch in master gemergt.

Einen Release Branch erstellen

Der Release Branch zweigt vom Branch development

ab, sobald development kurz vor einem neuen Release

steht. Zu diesem Zeitpunkt müssen alle Features für das

nächste anstehende Release in den Branch development

gemergt werden.

Der Start eines Release Branch bedeutet automatisch

die Vergabe der Versionsnummer des bevorstehenden

Release (also z. B. #1.0, 2.0. ... ). Davor reflektierte der

Branch development zwar bereits die Änderungen des

kommenden Release, es ist aber bis dahin noch unklar,

ob es sich um eine Version #0.x oder #x.0 handeln wird

(vgl. dazu Punkt 2).

Checkliste

Bevor ein Release Branch in ein neues Release münden

kann:

Mergen Sie den Release Branch in den Branch master

(zur Erinnerung: Jeder Commit ist per Definition ein

neues Release!).

Vergeben Sie einen Tag (z. B.: 1.0) für den Commit als

zukünftige Referenz auf diese Version.

Mergen Sie den Release Branch auch in den Branch

development, damit künftige Releases ebenfalls die

im Release Branch getätigten Bug Fixes enthalten

können.

Entfernen Sie den Release Branch.

Vor dem finalen Rollout werden keine größeren neuen

Features mehr gemergt – sollte dennoch gerade das

nächste Feature in den releasefähigen Status übergehen,

wird es im Branch development gemergt und dort bis

zum nächsten großen Release vorgehalten.

Hot!x Branch (hotfixes-*)

Der Hotfix Branch hilft dabei, schnell

und live Produktionsprobleme zu fixen.

Er ist dem Release Branch ähnlich, wird

aber unvorhergesehen gebrancht. Denn

er entsteht aus der Notwendigkeit, sofort

zu handeln, wenn der Zustand der pro-

duktiv laufenden Version unerwünschte

Merkmale aufweist (z. B. critical bugs in

der Production-Version, die sofort gefixt

werden müssen). Der Hotfix Branch

zweigt vom Branch master, oder besser

gesagt, von dem Tag auf dem Branch

master, das die Produktions version

markiert.

Die schnellen Production Fixes werden

auf dem Hotfix Branch erledigt, damit

zur gleichen Zeit auf dem Branch deve-

lopment weitergearbeitet werden kann.

Der Hotfix Branch wird in master und

development überführt. Danach wird

der Hotfix Branch wieder gelöscht.

Ausnahme!

Wenn parallel auch noch ein Release Branch aktiv ist, wird der Hotfix

Branch in der Regel nur in diesen gemergt. Mit dem Release Branch wer-

den die Fixes dann in den Master gemergt. Werden die im Hotfix Branch

getätigten Production Fixes besonders akut benötigt, wird sowohl in den

Release Branch als auch in den Development Branch gemergt.master

development

masterRelease #x.0

Bug Fix

Release

development

master

#1.2 läuft live, macht

Probleme

Erstellung eines Hotfix

Branch zur Lösung des

Problems in #1.2

development ist unstable bis

Hotfix Branch überführt wird

Hotfix Branch wird nach

Problemlösung entfernt

#1.2.1 läuft ohne

Probleme

Hotfix

development

master

Tag #1.0

Tag #2.0

Start Release #2.0

Release

Feature

Feature 2

development

master

development

Release #0.1Release #0.2

Initial

master

development

Feature

Feature 1

Release #xy

masterRelease #1.0

Start des

Release #1.0

Initial

Release

development

Feature

Feature 1

Grafische Umsetzung: meat* – concept and design

Dieser Platz ist frei für spannende

Add-ons aus dem

Git-Universum.

Sie finden Poster-Add-ons

in den Magazinen der

Software & Support Media GmbH.

Git The Big

Picture

Git/Hg-Client für den

professionellen Einsatz

syntevo.com/smartgithg

1) Lifecycle einer Git-Datei

Lokales Repository ist nicht von entferntem geklont worden,

soll aber mit einem anderen Repository verbunden werden

JLW�UHPRWH�D

GG�RULJLQ��U

HSRVLWRU\�XU

O!

Branching Commands

Zu einem neuen Branch (feature_branch) wechselnCommands

Presented by:

Git The Big

PictureThe Big

PictureThe Big

Großes Git-Poster!

www.eclipsemagazin.de