<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Aus dem Leben eines Szlauszafs (Entries tagged as git)</title>
    <link>http://th-h.de/blog/</link>
    <description>Immer eine Handvoll Heu unter der Sznauze.</description>
    <dc:language>en</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:thh@greenmeadow.szaf.org" />
    <generator>Serendipity 1.6.2 - http://www.s9y.org/</generator>
    <managingEditor>thh@inter.net</managingEditor>
<pubDate>Thu, 13 Jan 2011 16:55:41 GMT</pubDate>

    <image>
        <url>http://th-h.de/blog/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Aus dem Leben eines Szlauszafs - Immer eine Handvoll Heu unter der Sznauze.</title>
        <link>http://th-h.de/blog/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Tips und Tricks für den Umgang mit git</title>
    <link>http://th-h.de/blog/archives/1650-Tips-und-Tricks-fuer-den-Umgang-mit-git.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1650-Tips-und-Tricks-fuer-den-Umgang-mit-git.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1650</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1650</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bei meiner Arbeit mit &lt;em&gt;git&lt;/em&gt; stehe ich immer wieder vor der Frage, ob man dieses oder jenes damit nicht einfach machen können müßte. Meistens lautet die Antwort auf diese Frage &amp;#8220;ja&amp;#8221;, aber teilweise muß man schon etwas googeln, um diese Antwort zu finden. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; Daher möchte ich ab und an kleine ergoogelte Wissensschnippsel mit der Leserschaft teilen; vielleicht steht ja noch einmal jemand anderes vor demelben Problem (und überdies sind deutschsprachige Informationen zu &lt;em&gt;git&lt;/em&gt; nicht so wirklich umfänglich vorhanden).&lt;/p&gt; 
&lt;h2&gt;Git über SSH und mehrere SSH-Keys pro Host&lt;/h2&gt; 
&lt;p&gt;Mehr eine allgemeine SSH-Frage, aber da sie sich mir im Zusammenhang mit &lt;em&gt;git&lt;/em&gt; gestellt hat ... &lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Ein beliebter Zugriffsweg auf Git-Repositories ist der über SSH, insbesondere, wenn es auch um einen schreibenden Zugang geht und man diesen authentifizieren will. Zu diesem Zweck kann man sich den passenden SSH-Schlüssel für den Zugriff auf das Git-Repository über die SSH-Konfiguration definieren, bspw. durch einen Eintrag in &lt;em&gt;~/.ssh/config&lt;/em&gt; wie den folgenden:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;Host git.example.org&lt;br /&gt;Port 2022&lt;br /&gt;IdentityFile ~/.ssh/gitkey&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;SSH-Zugriffe auf den Server &amp;#8220;git.example.org&amp;#8221;&amp;#160; erfolgen also auf Port 2022 (statt 22) und unter Verwendung des Schlüssels &amp;#8220;gitkey&amp;#8221;. Der Git-Zugriff via SSH berücksichtigt diese Einstellungen dann automatisch.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Was aber tun, wenn man von demselben Client mit mehreren verschiedenen SSH-Schlüsseln auf denselben Server zugreifen muß, wie es insbesondere bei der Verwendung von Tools wie &lt;em&gt;gitosis&lt;/em&gt; auf der Serverseite vorkommen kann? Dieselbe Frage stellt sich natürlich, wenn man sich neben dem Zugriff auf ein Git-Repository auch ganz normal per SSH auf dem Server einloggen können will. Auf die obige Art und Weise läßt sich nur ein Key für den Zugriff auf &amp;#8220;git.example.org&amp;#8221; vordefinieren - und will man wirklich immer einen abweichenden Schlüssel per Option angeben? Eine Lösung wäre die Vergabe von weiteren CNAMEs im DNS für git.example.org, aber das skaliert auf die Dauer auch nicht.&lt;/p&gt; 
&lt;p&gt;Die einfachste Lösung dafür bieten Aliase direkt in der SSH-Konfiguration, wie das Git-Wiki &lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1723&amp;amp;entry_id=1650&quot; title=&quot;https://git.wiki.kernel.org/index.php/GitTips#How_to_pass_ssh_options_in_git.3F&quot;  onmouseover=&quot;window.status=&#039;https://git.wiki.kernel.org/index.php/GitTips#How_to_pass_ssh_options_in_git.3F&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;empfiehlt&lt;/a&gt;:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;Host private.example.com&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User myname&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hostname git.example.com&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IdentityFile ~/.ssh/private-identity&lt;br /&gt;Host public.example.com&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; User groupname&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hostname git.example.com&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IdentityFile ~/.ssh/public-identity&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Auf diese Art und Weise kann man denselben Server mit zwei verschiedenen Konfigurationen ansprechen.&lt;br /&gt;&lt;/p&gt; &lt;h2&gt;Übernahme einer einzelnen Datei aus einem anderen Branch&lt;br /&gt;&lt;/h2&gt; 
&lt;p&gt;Alle Änderungen aus einem anderen Entwicklungszweig zu übernehmen ist einfach und geht per &lt;em&gt;merge&lt;/em&gt;; nur bestimmte Änderungen (&lt;em&gt;commits&lt;/em&gt;) zu übernehmen funktioniert via &lt;em&gt;cherry-pick&lt;/em&gt;. (Warum auch immer das Rosinenpicken der Deutschen dem Angelsachsen ein Picken nach Kirschen ist ...) Aber wie kann man eine bestimmte Datei - also alle Änderungen, aber nur die in einer bestimmten Datei - aus einem anderen Branch übernehmen?&lt;/p&gt; 
&lt;p&gt;Zu dieser Frage hat Jason Rudolph die passende &lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1724&amp;amp;entry_id=1650&quot; title=&quot;http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/&quot;  onmouseover=&quot;window.status=&#039;http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Antwort&lt;/a&gt;: das geht mit &lt;em&gt;git-checkout&lt;/em&gt;, und zwar in der Form &lt;em&gt;git checkout $branch $path&lt;/em&gt;. Nehmen wir an, ich möchte die Fassung der Datei &amp;#8220;README&amp;#8221; aus dem Branch &amp;#8220;test&amp;#8221; in meinen Branch &amp;#8220;master&amp;#8221; übernehmen, aber eben nur diese Datei in genau dem Zustand, den sie im &amp;#8220;test&amp;#8221;-Branch hat. Das geht dann folgendermaßen:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;git checkout master&lt;br /&gt;git checkout test README&lt;br /&gt;git commit -m &amp;#8216;Imported README from test branch&amp;#8217;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Genauso funktioniert das natürlich mit mehreren Dateien:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;git checkout test README doc/explanation.txt doc/TODO&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Voilà. Soviel für heute. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt; &lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 12 Jan 2011 17:30:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1650-guid.html</guid>
    <category>git</category>
<category>gitosis</category>
<category>ssh</category>

</item>
<item>
    <title>Mantis: Git-Integration - ein steiniger Weg</title>
    <link>http://th-h.de/blog/archives/1590-Mantis-Git-Integration-ein-steiniger-Weg.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1590-Mantis-Git-Integration-ein-steiniger-Weg.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1590</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1590</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Sehr praktisch ist es bei einem Bugtracker, wenn er mit dem verwendeten Versions-/Sourcecode-Verwaltungssystem (SCM-System, &lt;em&gt;source code management&lt;/em&gt;) interagieren kann, Änderungen im Code, die - laut Kommentar (Commit-Message) - einen bestimmten Fehler beheben, also direkt auch dazu führen, daß der entsprechende Fehlerbericht (Bugreport) als erledigt gekennzeichnet wird. Man kennt dieses Verhalten - bspw. - vom Debian-Bugtracker.&lt;/p&gt; 
&lt;p&gt;Grundsätzlich ist das auch schon immer mit Mantis möglich; allerdings war die bisher vorhandene Unterstützung rudimentär und primär auf SVN abgestellt; sie wurde auch in der aktuellen Entwicklungsversion 1.3 entfernt. Seit Anfang 2009 gibt es nämlich von einem der Mantis-Entwickler, &lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1598&amp;amp;entry_id=1590&quot; title=&quot;http://leetcode.net/&quot;  onmouseover=&quot;window.status=&#039;http://leetcode.net/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;John Reese&lt;/a&gt;, ein Plugin namens &lt;em&gt;Source Control Integration&lt;/em&gt;, das sich beim Bugtracker für Mantis selbst bereits seit Monaten im Echtbetrieb bewährt hat. Es liefert ein Framework für die Anbindung beliebiger Versionsverwaltungssysteme, und fertige Plugins für die Anbindung an &lt;em&gt;git&lt;/em&gt; via &lt;em&gt;GitHub&lt;/em&gt; oder &lt;em&gt;GitWeb&lt;/em&gt; und an &lt;em&gt;SVN&lt;/em&gt; via &lt;em&gt;SourceForge&lt;/em&gt; oder &lt;em&gt;WebSVN&lt;/em&gt; sind direkt dabei.&lt;/p&gt; 
&lt;p&gt;Leider ist &lt;a title=&quot;Mantis Bug Tracker und Mantis Graph 1.0&quot; href=&quot;http://th-h.de/blog/archives/1589-Mantis-Bug-Tracker-und-Mantis-Graphs-1.0.html&quot;&gt;auch hier&lt;/a&gt; die Dokumentation der schwache Punkt. Eine solche fehlt nämlich bisher völlig; einen Einstieg liefert einzig ein &lt;a title=&quot;Leetcode: Integrating Git and SVN with the Mantis Bug Tracker&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1600&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;http://leetcode.net/blog/2009/01/integrating-git-svn-with-mantisbt/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Blogbeitrag&lt;/a&gt; vom 07.01.2009, der die Vorgehensweise beschreibt. Weitere Blogbeiträge (von &lt;a title=&quot;Leetcode: Integrating Source Control Tools with Mantis Bug Tracker&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1601&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;http://leetcode.net/blog/2009/03/integrating-source-control-with-mantisbt/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;März&lt;/a&gt; und &lt;a title=&quot;Leetcode: Detailed Integration of Subversion in MantisBT&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1602&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;http://leetcode.net/blog/2009/10/detailed-integration-of-subversion-in-mantisbt/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Oktober&lt;/a&gt; 2009) umreißen die technischen Grundlagen und beschreiben den Einsatz für Subversion, helfen aber ansonsten auch nicht wirklich weiter.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Ich habe mir die Vorgehensweise bisher folgendermaßen zusammengereimt:&lt;/p&gt; 
&lt;ul&gt; 
&lt;li&gt;Download der nötigen Plugins (&lt;a title=&quot;Git-Repository für das Meta-Plugin&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1603&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;http://git.mantisforge.org/w/meta.git&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&lt;em&gt;Meta Programming&lt;/em&gt;&lt;/a&gt;, &lt;a title=&quot;Git-Repository für das Source-Control-Integration-Plugin&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1604&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;http://git.mantisforge.org/w/source-integration.git&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&lt;em&gt;Source Control Integration&lt;/em&gt;&lt;/a&gt; und - in meinem Fall - &lt;em&gt;Gitweb Integration&lt;/em&gt;). Fertige Lösungen scheint es dafür nicht zu geben, die Plugins sind offenbar aus dem Git-Repository des Entwicklers auszuchecken (dabei finden sich die vorgenannten Plugins für die Anbindung an &lt;em&gt;git&lt;/em&gt; und &lt;em&gt;SVN&lt;/em&gt; im selben Repository wie &lt;em&gt;Source Control Integration&lt;/em&gt;). Danach gehören die entsprechenden Verzeichnisse ins Mantis-Plugin-Verzeichnis, das man in Mantis auch unter dem Punkt &lt;strong&gt;[Manage]&lt;/strong&gt; (&lt;em&gt;http://host.domain.example/mantis/manage_overview_page.php&lt;/em&gt;) angezeigt findet.&lt;br /&gt;&lt;u&gt;&lt;strong&gt;UPDATE &lt;/strong&gt;vom 30.10.2012:&lt;/u&gt; Das Git-Repository des Entwicklers ist offenbar nicht mehr aktuell bzw. liegt jetzt bei Github: &lt;em&gt;&lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1910&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;https://github.com/mantisbt-plugins/source-integration&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;Source-Control-Integration-Plugin bei GitHub&quot;&gt;Source Control Integration&lt;/a&gt;&lt;/em&gt;&lt;br /&gt;Das Plugin &lt;em&gt;Meta Programming&lt;/em&gt; sollte bei Mantis 1.2.x bereits mit dabei sein und muss daher nicht mehr installiert werden..&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
&lt;li&gt;Anschließend sind die Plugins - in der richtigen Reihenfolge - unter &lt;strong&gt;[Manage Plugins]&lt;/strong&gt; (&lt;em&gt;http://host.domain.example/mantis/manage_plugin_page.php&lt;/em&gt;) zu installieren.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
&lt;li&gt;Danach kann das Plugin, wie im genannten Blogbeitrag beschrieben, konfiguriert, ein Repository definiert und dieses dann eingelesen werden.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Letzteres hat bei mir auf Anhieb zu einer eleganten Fehlermeldung geführt:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;APPLICATION ERROR #401&lt;/p&gt; 
&lt;p&gt;Database query failed. Error received from database was #1048: Column &amp;#8216;author&amp;#8217; cannot be null for the query: INSERT INTO mantis_plugin_Source_changeset_table ( repo_id, revision, parent, branch, user_id,timestamp, author, message, info, ported, author_email, committer, committer_email, committer_id) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ).&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Deren Ursache liegt darin, daß das Plugin die Ausgabe von GitWeb nicht richtig parsen kann. In meinem Fall war der Übeltäter die in GitWeb aktivierte Avatar-Funktion; einen &lt;a title=&quot;Leetcode-Mantis-Bug #85&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1605&amp;amp;entry_id=1590&quot;  onmouseover=&quot;window.status=&#039;http://leetcode.net/mantis/view.php?id=85#c211&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Patch&lt;/a&gt; dafür findet man im Bugtracker des Entwicklers.&lt;/p&gt; 
&lt;p&gt;&lt;u&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;/u&gt; Auch mit der GitWeb-Version 1.7.1 gibt es Schwierigkeiten, namentlich, wenn und weil jetzt die Möglichkeit der Suche nach Commits des jeweiligen Autors aktiviert ist. Wer einen Patch dazu sucht, findet diesen an der bereits genannten Stelle.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;UPDATE &lt;/strong&gt;vom 30.10.2012:&lt;/u&gt; Der Bugtracker des Entwicklers ist auf eine statische Archiv-Version zurückgesetzt und enthält den Patch daher nicht mehr. Er findet sich dafür hier in den Kommentaren. - Die aktuelle Version im Github-Repository des Entwicklers scheint ihn aber im wesentlichen bereits eingebaut zu haben.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Danach funktionierte der Import aber und lief wie am Schnürchen.&lt;/p&gt; 
&lt;p&gt;Jetzt möchte man das nur noch automatisieren; die entsprechende Angabe im genannten Blogbeitrag ...&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;For Gitweb, SourceForge, or WebSVN integration, find your repositorys 
ID, and setup a cronjob (or something equivalent) to run &amp;quot;curl 
http://yoururl.xyz/mantisbt/plugin.php?page=Source/repo_import_latest&amp;amp;id=&lt;strong&gt;XX&lt;/strong&gt;&amp;quot; &lt;br /&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;... ist aber leider unzutreffend, denn die entsprechende Seite kann nur durch einen - eingeloggten - Admin aufgerufen werden. Korrekt ist vielmehr der Aufruf von &lt;em&gt;http://host.domain.example/mantis/plugin.php?page=Source/import&amp;amp;id=&lt;strong&gt;XX&lt;/strong&gt;&lt;/em&gt;; das ist die vorgesehene API dafür. Der entsprechende Aufruf kann per Cronjob, aber sicherlich auch als Post-Update-Hook in &lt;em&gt;git&lt;/em&gt; verwirklicht werden:&lt;/p&gt; 
&lt;blockquote&gt; 
&lt;p&gt;curl &amp;#8216;http://host.domain.example/mantis/plugin.php?page=Source/import&amp;amp;id=XX&amp;#8217; &amp;gt; /dev/null&lt;br /&gt;&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;p&gt;Über weitere Erfahrungsberichte zu diesem Thema würde ich mich übrigens freuen. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 15 May 2010 10:46:00 +0200</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1590-guid.html</guid>
    <category>anleitung</category>
<category>git</category>
<category>mantis</category>

</item>
<item>
    <title>msysgit mit PLink, Pageant und SSH</title>
    <link>http://th-h.de/blog/archives/1566-msysgit-mit-PLink,-Pageant-und-SSH.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1566-msysgit-mit-PLink,-Pageant-und-SSH.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1566</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1566</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;div class=&quot;serendipity_imageComment_right&quot; style=&quot;width: 96px&quot;&gt;
&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a href=&quot;javascript:void(0);&quot; onmouseover=&quot;return overlib(&#039;&lt;img src=/blog/uploads/2010-04-12-erweitert.jpg&gt;&#039;, WIDTH, 1, HEIGHT, 1);&quot; onmouseout=&quot;return nd();&quot;&gt;&lt;img class=&quot;serendipity_image_right&quot; height=&quot;110&quot; src=&quot;http://th-h.de/blog/uploads/2010-04-12-erweitert.serendipityThumb.jpg&quot; width=&quot;96&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Systemeigenschaften -&amp;gt; Erweitert&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Was mich bei meiner Nutzung von &lt;a title=&quot;Git unter Windows&quot; href=&quot;http://th-h.de/blog/archives/1549-Git-unter-Windows.html&quot;&gt;git unter Windows&lt;/a&gt; noch etwas störte war vor allem, daß ich für den Zugriff auf externe Repositories bisher auf &lt;em&gt;TortoiseGit&lt;/em&gt; angewiesen war, weil &lt;em&gt;Git on Windows&lt;/em&gt; (&lt;em&gt;msysgit&lt;/em&gt;) nicht recht zur Kommunikation über SSH bereit war; angeblich wurde nie der passende Schlüssel gefunden, obwohl eigentlich &lt;em&gt;PLink&lt;/em&gt; und &lt;em&gt;Pageant&lt;/em&gt; aus dem &lt;em&gt;Putty&lt;/em&gt;-Paket installiert waren und mit &lt;em&gt;TortoiseGit&lt;/em&gt; ihre Arbeit auch prima taten. Die Google-Recherche führte mich dann allerdings zu einem &lt;a title=&quot;Bits&amp;amp;Pix: Git: setup msysGit install with pageant/plink from putty&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1483&amp;amp;entry_id=1566&quot;  onmouseover=&quot;window.status=&#039;http://www.bitsandpix.com/entry/git-setup-msysgit-install-with-pageantplink-from-putty/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;passenden Beitrag&lt;/a&gt;, und nach einigem ausprobieren kann ich bestätigen, daß die dort genannte Lösung funktioniert:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Git on Windows&lt;/em&gt; (&lt;em&gt;msysgit&lt;/em&gt;) installieren &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Putty&lt;/em&gt; installieren (soweit erforderlich) &lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pageant&lt;/em&gt; konfigurieren (soweit war ich schon) &lt;/li&gt;
&lt;li&gt;Umgebungsvariable &lt;em&gt;GIT_SSH&lt;/em&gt; auf &lt;em&gt;PLink&lt;/em&gt; setzen &lt;/li&gt;
&lt;li&gt;&lt;em&gt;GitBash&lt;/em&gt; und/oder &lt;em&gt;GitGui&lt;/em&gt; neu starten (&lt;strong&gt;!&lt;/strong&gt;) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Danach funktionierte die Sache bei mir wunderbar.&lt;/p&gt;
&lt;div class=&quot;serendipity_imageComment_left&quot; style=&quot;width: 98px&quot;&gt;
&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a href=&quot;javascript:void(0);&quot; onmouseover=&quot;return overlib(&#039;&lt;img src=/blog/uploads/2010-04-12-environment.jpg&gt;&#039;, WIDTH, 1, HEIGHT, 1);&quot; onmouseout=&quot;return nd();&quot;&gt;&lt;img class=&quot;serendipity_image_left&quot; height=&quot;110&quot; src=&quot;http://th-h.de/blog/uploads/2010-04-12-environment.serendipityThumb.jpg&quot; width=&quot;98&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Umgebungsvariablen&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Die Umgebungsvariable &lt;em&gt;GIT_SSH&lt;/em&gt; setzt man unter Windows XP in den &amp;#8220;&lt;em&gt;Systemeigenschaften&lt;/em&gt;&amp;#8221; (Rechtsklick auf &amp;#8220;&lt;em&gt;Arbeitsplatz&lt;/em&gt;&amp;#8221; oder &amp;#8220;My &lt;em&gt;Computer&lt;/em&gt;&amp;#8221; und dann &amp;#8220;&lt;em&gt;Eigenschaften&lt;/em&gt;&amp;#8221;) auf der Registerkarte &amp;#8220;&lt;em&gt;Erweitert&lt;/em&gt;&amp;#8221; unter dem Button &amp;#8220;&lt;em&gt;Umgebungsvariablen&lt;/em&gt;&amp;#8221; unter &amp;#8220;&lt;em&gt;Systemvariablen&lt;/em&gt;&amp;#8221;. Ein beherzter Klick auf &amp;#8220;Neu&amp;#8221; fördert ein Eingabefeld zutage, in dem man nunmehr &amp;#8220;&lt;em&gt;GIT_SSH&lt;/em&gt;&amp;#8221; und den kompletten Pfad zur Datei &amp;#8220;&lt;em&gt;PLink.exe&lt;/em&gt;&amp;#8221; - bspw. &amp;#8220;&lt;em&gt;C:\Programme\PuTTY\plink.exe&lt;/em&gt;&amp;#8221; - eingibt. Neustart von &lt;em&gt;msysgit&lt;/em&gt; nicht vergessen!&lt;/p&gt;
&lt;p&gt;Voilà! Bei mir funktionierte die SSH-Übertragung dann ohne jedes Problem.&lt;/p&gt;  
    </content:encoded>

    <pubDate>Mon, 12 Apr 2010 23:02:00 +0200</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1566-guid.html</guid>
    <category>anleitung</category>
<category>git</category>
<category>windows</category>

</item>
<item>
    <title>Sprachauswahl bei Git on Windows (msysgit)</title>
    <link>http://th-h.de/blog/archives/1560-Sprachauswahl-bei-Git-on-Windows-msysgit.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1560-Sprachauswahl-bei-Git-on-Windows-msysgit.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1560</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1560</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Wie ich bereits im Februar &lt;a title=&quot;Git unter Windows&quot; href=&quot;http://th-h.de/blog/archives/1549-Git-unter-Windows.html&quot;&gt;beschrieben&lt;/a&gt; habe, benutze ich unter Windows msysgit bzw. &amp;#8220;Git on Windows&amp;#8221;. Die GUI-Variante ermöglicht die meisten denkbaren Aktionen in sehr bequemer Weise durchzuführen; sie krankt allerdings - aus meiner Sicht - arg an ihrer Übersetzung, die sämtliche Menüeinträge und damit natürlich auch Fachbegriffe umfaßt und manchmal zu Rätselraten führt, was genau gemeint sein mag. &amp;#8220;Zweig&amp;#8221; ist ja noch klar, &amp;#8220;Zusammenführen&amp;#8221; für &amp;#8220;Merge&amp;#8221; auch, aber das &amp;#8220;Version&amp;#8221; für &amp;#8220;Commit&amp;#8221; steht erschließt sich nicht sofort. Und Menüpunkte unterhalb von &amp;#8220;Zweig&amp;#8221; wie &amp;#8220;Erstellen&amp;#8221;, &amp;#8220;Umstellen&amp;#8221; oder &amp;#8220;Zurücksetzen&amp;#8221; sind auch alles andere als klar - &amp;#8220;Erstellen&amp;#8221; ist ohne Frage &amp;#8220;Create&amp;#8221;, aber &amp;#8220;Umstellen&amp;#8221;? Gut, man kann vielleicht noch darauf kommen, daß das für &amp;#8220;Checkout / Switch&amp;#8221; steht ... aber bedeutet &amp;#8220;Zurücksetzen&amp;#8221; jetzt &amp;#8220;Reset&amp;#8221; oder &amp;#8220;Rebase&amp;#8221;? Usw. usf. ... Da wäre doch eine englische Bedienungsoberfläche eine tolle Sache, da weiß man wenigstens, welche Funktion jeweils gemeint ist, und kann &lt;strong&gt;die&lt;/strong&gt; dann ggf. nachschlagen.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Es scheint leider derzeit noch keine Möglichkeit zur manuellen Auswahl einer Sprache zu geben, auch nicht durch Setzen von Environment-Variablen (zumindest hat Google sich insoweit ausgeschwiegen); es wird automatisch auf die Systemsprache abgehoben. Eine Lösung gibt es dennoch - wenn man dafür sorgt, daß die Programme ihre deutschen Sprachdateien nicht mehr finden, fallen sie auf den englischen Default zurück, und das ist ja genau das, was wir wollen. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;Die Sprachdateien liegen in &lt;em&gt;%ProgramFiles%\Git\share\git-gui\lib\msgs&lt;/em&gt; bzw. &lt;em&gt;%ProgramFiles%\Git\share\gitk\lib\msgs&lt;/em&gt;; dort muß jeweils nur die Datei &amp;#8220;&lt;em&gt;de.msg&lt;/em&gt;&amp;#8221; entfernt - oder umbenannt - werden, und alles wird gut (bzw. in diesem Fall englischsprachig). Nach Updates ist dieser Schritt natürlich erneut erforderlich.&lt;br /&gt;&lt;/p&gt;  
    </content:encoded>

    <pubDate>Fri, 09 Apr 2010 07:21:00 +0200</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1560-guid.html</guid>
    <category>anleitung</category>
<category>git</category>
<category>windows</category>

</item>
<item>
    <title>git archive</title>
    <link>http://th-h.de/blog/archives/1551-git-archive.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1551-git-archive.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1551</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1551</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Ein weiteres nettes Feature von &lt;em&gt;git &lt;/em&gt;sind die Möglichkeiten, die &lt;em&gt;git archive&lt;/em&gt; bietet. So läßt sich der Inhalt eines &lt;em&gt;git&lt;/em&gt;-Repositories leicht in ein &lt;em&gt;tar&lt;/em&gt;-File packen, bspw. für ein Release.&lt;/p&gt; 
&lt;p&gt;Voraussetzung dafür ist beim Zugriff über &lt;em&gt;git-daemon&lt;/em&gt;, daß der entsprechende Service aktiviert ist; für das Debian-Paket bedeutet das die Erweiterung des Aufrufs in &lt;em&gt;/etc/sv/git-daemon/run&lt;/em&gt; um den Parameter &amp;#8220;--enable=upload-archive&amp;#8221;.&lt;/p&gt; 
&lt;p&gt;Dann aber kann mit einem Aufruf wie&lt;/p&gt; 
&lt;pre&gt;git archive --format=tar --remote=git://git.domain.example/$REPO.git --prefix=$PREFIX/ $TAG | gzip &amp;gt; $REPO.tar.gz&lt;/pre&gt; 
&lt;p&gt;aus dem Repository $REPO.git dessen Inhalt bei Commit (oder an der Spitze des Branches, oder an dem Tag) $TAG in eine &lt;em&gt;.tar.gz&lt;/em&gt;-Datei gepackt werden, wobei die Dateien ein $PREFIX vorangestellt bekommen.&lt;/p&gt; 
&lt;pre&gt;git archive --format=tar --remote=git://git.domain.example/myprog.git --prefix=myprog-2.17/ 2.17 | gzip &amp;gt; myprog-2.17.tar.gz&lt;/pre&gt; 
&lt;p&gt;erzeugt also aus dem Repository myprog.git in der mit &amp;#8220;2.17&amp;#8221; getaggten Version eine Datei &lt;em&gt;myprog-2.17.tar.gz&lt;/em&gt;, die alle im Repository enthaltenen Dateien mit dem Verzeichnis-Präfix &amp;#8220;myprog-2.17/&amp;#8221; enthält.&lt;/p&gt; 
&lt;p&gt;Das ganze läßt sich noch etwas aufpeppen, wenn man bspw. bestimmte Dateien (&lt;em&gt;.gitignore&lt;/em&gt;, ...) aus dem Repository nicht im Tarball haben möchte und/oder noch andere Änderungen vornehmen will, wie bspw. die Erzeugung eines &lt;em&gt;README&lt;/em&gt; aus der eingebetteten POD-Dokumentation:&lt;/p&gt; 
&lt;pre&gt;#! /bin/bash
# do a release of myprog
# $1: version number

# make tempdir
tempdir=`mktemp -td myprog-XXXXX`

git archive --format=tar --remote=git://git.domain.example/myprog.git --prefix=myprog-$1/ $1 | (cd $tempdir &amp;amp;&amp;amp; tar xf -)

cd $tempdir/myprog-$1/
pod2text -l myprog.pl README
rm .gitignore

cd $tempdir
tar -czf /var/www/myprog/download/myprog-$1.tar.gz myprog-$1/
rm -r $tempdir&lt;/pre&gt; 
&lt;p&gt;Und schließlich kann man auf diese Weise auch nur eine einzelne Datei aus dem Repository extrahieren:&lt;/p&gt; 
&lt;pre&gt;git archive --format=tar --remote=git://git.domain.example/repository.git master beispiel.txt | tar xf -&lt;/pre&gt; 
&lt;p&gt;extrahiert die Datei &lt;em&gt;beispiel.txt&lt;/em&gt; aus der Spitze des Branches &lt;em&gt;master&lt;/em&gt; des Repositorys &lt;em&gt;repository.git&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;Ich finde das alles ausgesprochen praktisch.&lt;br /&gt;&lt;/p&gt;  
    </content:encoded>

    <pubDate>Sat, 27 Feb 2010 18:52:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1551-guid.html</guid>
    <category>anleitung</category>
<category>git</category>

</item>
<item>
    <title>Was mir an git gefällt</title>
    <link>http://th-h.de/blog/archives/1550-Was-mir-an-git-gefaellt.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1550-Was-mir-an-git-gefaellt.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1550</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1550</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Nachdem ich mich jetzt bereits einige Wochen mit &lt;em&gt;git&lt;/em&gt; auseinandersetze, ist es vielleicht einmal Zeit für ein Fazit. Ich mag mir kein fachkundiges Urteil über &lt;em&gt;git&lt;/em&gt; erlauben; dazu fehlt mir der wirkliche Vergleich mit anderen Versionsverwaltungssystemen und die Erfahrung mit (gemeinsamer) Softwareentwicklung, und letztlich auch der wirklich &amp;#8220;fortgeschrittene&amp;#8221; Umgang mit &lt;em&gt;git&lt;/em&gt;. Ich denke aber, daß ich - obschon ich &lt;em&gt;git&lt;/em&gt; bisher &amp;#8220;solo&amp;#8221; nutze, also zu seinen Stärken und Schwächen bei der Zusammenarbeit selbst nichts sagen kann - durchaus einige Punkte benennen kann, die mir an &lt;em&gt;git&lt;/em&gt; gut gefallen.&lt;/p&gt; 
&lt;p&gt;Da wäre auf den ersten Blick bereits die Verzeichnisstruktur: wo &lt;em&gt;SVN &lt;/em&gt;mich mit &lt;em&gt;trunk&lt;/em&gt;, &lt;em&gt;tags&lt;/em&gt; und &lt;em&gt;branches&lt;/em&gt; verwirrt, gibt es bei &lt;em&gt;git&lt;/em&gt; ein Verzeichnis &lt;em&gt;.git&lt;/em&gt;, und das war&amp;#8217;s.&lt;/p&gt; 
&lt;p&gt;Auch zunächst eher eine Äußerlichkeit, aber sehr bequem, ist die Möglichkeit, mit &lt;em&gt;git&lt;/em&gt; &amp;#8220;offline&amp;#8221; zu arbeiten. Bei &lt;em&gt;git&lt;/em&gt;
 wird die Arbeitskopie nicht aus einem zentralen Repository ausgecheckt;
 vielmehr wird das zentrale Repository im Normalfall komplett kopiert und steht mir 
dann auch offline mit der gesamten Versionsgeschichte zur Verfügung. Das ermöglicht es überdies, neben einem &amp;#8220;offiziellen&amp;#8221; 
Repository - das im Netz steht - beliebig viele &amp;#8220;inoffizielle&amp;#8221; Repositories vorzuhalten. Änderungen kann ich so zunächst nur in meiner Kopie des 
Repositories vornehmen (und sie ggf. auf andere eigene Rechner spiegeln 
und auch mit anderen Entwicklern austauschen) und sie erst dann 
veröffentlichen, wenn ich sie für veröffentlichungsreif halte. So kann 
ich bspw. immer nur bestimmte Zweige meines Entwicklungsrepositories in 
ein öffentliches Repository übertragen und andere, an denen ich noch bastele, nicht veröffentlichen. &lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Das problemlose Anlegen von Kopien (Zweigen, &lt;em&gt;branches&lt;/em&gt;) ist aus meiner Sicht ein weiterer Vorteil; ein Entwicklungszweig (&lt;em&gt;branch&lt;/em&gt;) ist trivial und schnell angelegt und ebenso schnell auch wieder entfernt. Das ermöglich ein schmerzloses Ausprobieren 
von Änderungen jeder Art; man kann für jede Idee einfach einmal schnell einen neuen Zweig anlegen, sie ausprobieren und dann ggf. verwerfen oder auf Eis legen kann - oder in die &amp;#8220;eigentliche&amp;#8221; Entwicklungslinie übernehmen. Auch lassen sich so verschiedene Ideen einfach in verschiedenen Branches entwickeln und dann jederzeit direkt in den Hauptzweig übernehmen, oder man kann sie erst noch etwas &amp;#8220;köcheln&amp;#8221; lassen; daneben können verschiedene Entwicklungsstränge bspw. für eine geplante neue Version und für Bugfixes älterer Versionen nebeneinander laufen.&lt;/p&gt; 
&lt;p&gt;Ergänzend dazu fasziniert mich die Möglichkeit, meine Commits nachträglich nachzubessern und neu zu sortieren. Die Möglichkeit fraktionierter Commits hatte ich bereits &lt;a title=&quot;INN-Funktionsweise: Steuernachrichten und Filter&quot; href=&quot;http://th-h.de/blog/archives/1499-INN-Funktionsweise-Steuernachrichten-und-Filter.html&quot;&gt;angesprochen&lt;/a&gt;; außerdem kann ich jederzeit per interaktivem &lt;em&gt;rebase&lt;/em&gt; einzelne Commits zusammenfassen. Oder ich setze einfach nur den Index auf eine alte Version zurück, so daß ich dann die Änderungen in der aktuellen Arbeitskopie gegenüber diesem alten Zustand neu einchecken kann, auch in einzelnen Teilen. In diese Reihe gehört auch die Möglichkeit, mein lokales Repository - oder einzelne Entwicklungszweige darin - immer wieder neu auf den aktuellen Stand des &amp;#8220;offiziellen&amp;#8221; Repositories - oder des Hauptentwicklungszweiges - aufsetzen zu lassen. All das ermöglicht es - auch zusammen mit dem leichten Anlegen neuer &lt;em&gt;branches&lt;/em&gt; - auf der einen Seite, nahezu beliebig &amp;#8220;herumzuspielen&amp;#8221; und dabei dem Motto &amp;#8220;Commit early, commit often&amp;#8221; zu folgen, auf der anderern Seite aber später, wenn das Feature gereift ist, eine logische Abfolge von einzelnen Patches zu committen, die die ganzen Sackgassen und Fehlversuche auslässt und möglichst einfach nachzuvollziehen ist.&lt;/p&gt; &lt;p&gt;Um ein paar Beispiele für die Vorteile dieser Arbeitsweise zu nennen:&lt;br /&gt; &lt;/p&gt; 
&lt;p&gt;Ich kann zum Beispiel während der laufenden Entwicklung jeden Entwicklungszweig (&lt;em&gt;branch&lt;/em&gt;)
immer wieder periodisch neu auf den aktuellen Stand des Hauptzweigs (&lt;em&gt;master 
branch&lt;/em&gt;) aufsetzen lassen (&lt;em&gt;rebase&lt;/em&gt;); wenn die Entwicklung eines
 bestimmten Features dann reif ist, kann ich sie in den Hauptzweig 
übernehmen und habe dann nur genau diese Änderungen in der 
Versionsverwaltung stehen, und zwar ausgehend vom aktuellen Stand des 
Hauptzweigs. Statt &lt;em&gt;rebase&lt;/em&gt; könnte ich natürlich auch &lt;em&gt;merge&lt;/em&gt; benutzen, dann habe ich aber eine Unzahl von für das Verständnis überzähligen Commits in der Versionsgeschichte stehen.&lt;/p&gt; 
&lt;p&gt;Nehmen wir an, ich arbeite an einem bestimmten Feature und committe 
Änderungen oft und zeitnah (um sie ggf. wieder zurücknehmen zu können, 
wenn sich der Weg als Irrweg erweist). Irgendwann bin ich dann mit dem 
Sachstand zufrieden und halte das Feature für reif genug für das nächste
 Release. Jetzt könnte ich den Entwicklungszweig einfach in den 
Hauptzweig mergen; dann steht aber das gesamte hin und her in der 
Versionsgeschichte, was sie auf die Dauer eher unübersichtlich macht. 
Ich kann aber auch durch interaktives &lt;em&gt;rebase&lt;/em&gt; und/oder durch ein &lt;em&gt;reset&lt;/em&gt; 
zunächst den Entwicklungszweig neu zusammenstellen und entscheiden, in 
wie viele Commits in welcher Reihenfolge ich meine diversen Änderungen 
aufgeteilt haben möchte. Ich schreibe quasi rückblickend die 
Versionsgeschichte nachvollziehbar und ordentlich neu und merge dann 
eine logische Abfolge von einzelnen Schritten in den Hauptzweig. Das 
sieht nicht nur eleganter aus, es ist auch leichter verständlich. &lt;/p&gt; 
&lt;p&gt;Andersherum kann ich vorgenommene Änderungen auch sukzessive in 
mehreren Commits in die Versionsverwaltung schreiben. Angenommen, ich 
habe eine Website in einem &lt;em&gt;git&lt;/em&gt;-Repository liegen und nehme 
umfangreiche Änderungen und Ergänzungen an einer Webseite vor. Bei 
dieser Gelegenheit fallen mir auch einige Rechtschreibfehler im bereits 
vorhandenen Text auf. Jetzt könnte ich entweder erst meine Änderungen 
und Ergänzungen abschließen, sie committen und dann in einem zweiten 
Schritt die Rechtschreibfehler beheben (wenn ich das nicht bis dahin 
vergessen habe). Oder ich behebe die Rechtschreibfehler nebenbei mit und
 committe sie zusammen mit den Änderungen; aber dann wird die commit 
message ein Gemischtwarenladen und ich kann v.a. meine Änderungen nicht 
isoliert reverten. Mit &lt;em&gt;git&lt;/em&gt; kann ich die an der Arbeitskopie 
vorgenommenen Veränderungen stückchenweise committen: bspw. erst 
isoliert die Rechtschreibfehler, und dann - getrennt davon - die 
zeitgleich vorgenommenen Änderungen und Ergänzungen. Danach habe ich 
zwei getrennte Commits, die zwei logisch verschiedene Vorgänge getrennt 
wiedergeben und die auch getrennt zurückgenommen werden können.&lt;/p&gt; 
&lt;p&gt;Ich halte das - mit Vorsicht genutzt - für ein sehr interessantes 
Arbeitswerkzeug. &amp;#8220;Mit Vorsicht genutzt&amp;#8221; deshalb, weil es natürlich fatal
 ist, die Versionsgeschichte bereits veröffentlichter &lt;em&gt;branches&lt;/em&gt; 
umzuschreiben ... deshalb sollte man entweder nur die Entwicklungszweige öffentlich zugänglich machen, die man auch unverändert so stehenlassen möchte, oder wenigstens klar kommunizieren, welche Entwicklungszweige &amp;#8220;work in progress&amp;#8221; sind und keinesfalls für eigene Entwicklungszwecke gepullt werden sollen.&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 24 Feb 2010 22:33:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1550-guid.html</guid>
    <category>git</category>

</item>
<item>
    <title>Git unter Windows</title>
    <link>http://th-h.de/blog/archives/1549-Git-unter-Windows.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1549-Git-unter-Windows.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1549</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1549</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bereits Anfang Januar hatte ich von &lt;a href=&quot;http://th-h.de/blog/archives/1485-git.html&quot; title=&quot;Git&quot;&gt;Git&lt;/a&gt; berichtet und danach geschildert, wie man &lt;em&gt;Git&lt;/em&gt;-Repositories mit &lt;em&gt;gitosis&lt;/em&gt; und &lt;em&gt;gitweb&lt;/em&gt;, offen wie auch paßwortgeschützt, aufsetzen kann. Seitdem habe ich eine ganze Reihe Projekte in &lt;em&gt;Git&lt;/em&gt;-Repositories eingecheckt und gewöhne mich immer mehr an die Arbeit mit &lt;em&gt;Git&lt;/em&gt;, zumeist allerdings unter Windows (weil ich auf Laptop wie auch Desktoprechnern unter Windows arbeite).&lt;/p&gt; 
&lt;p&gt;Dazu verwende ich &lt;strong&gt;&lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1460&amp;amp;entry_id=1549&quot;  onmouseover=&quot;window.status=&#039;http://code.google.com/p/tortoisegit/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;code.google.com: TortoiseGit&quot;&gt;TortoiseGit&lt;/a&gt;&lt;/strong&gt;, eine Portierung des recht bekannten (und gelobten) &lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1461&amp;amp;entry_id=1549&quot;  onmouseover=&quot;window.status=&#039;http://tortoisesvn.tigris.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;TortoiseSVN&quot;&gt;&lt;em&gt;TortoiseSVN&lt;/em&gt;&lt;/a&gt;, und zugleich &lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1462&amp;amp;entry_id=1549&quot;  onmouseover=&quot;window.status=&#039;http://code.google.com/p/msysgit/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;code.google.com: msysgit&quot;&gt;&lt;strong&gt;Git on Windows&lt;/strong&gt;&lt;/a&gt; (&lt;em&gt;msysgit&lt;/em&gt;), das ohnehin als Voraussetzung für die Verwendung von &lt;em&gt;TortoiseGit&lt;/em&gt; heruntergeladen werden muß. Beide ergänzen sich, wie ich finde, recht gut. &lt;em&gt;TortoiseGit&lt;/em&gt; ermöglicht eine einfache Definition des Remote Repository und elegante Lösungen für die Darstellung von Diffs und Merges, ganz zu schweigen von der grafischen Darstellung des Dateistatus im Explorer; die Git-Bash und GitTk aus &lt;em&gt;msysgit&lt;/em&gt; hingegen sind m.E. optimal für Branching und (inkrementielle) Commits sowie für die Darstellung der History. Störend allenfalls, daß die Tools teilweise - trotz der einigermaßen großzügigen Ausstattung an Rechenleistung und RAM - arg langsam wirken. Insgesamt aber, wie ich finde, eine sehr bequeme Lösung.&lt;br /&gt;&lt;/p&gt;  
    </content:encoded>

    <pubDate>Sun, 21 Feb 2010 17:21:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1549-guid.html</guid>
    <category>git</category>
<category>windows</category>

</item>
<item>
    <title>INN-Funktionsweise: Steuernachrichten und Filter</title>
    <link>http://th-h.de/blog/archives/1499-INN-Funktionsweise-Steuernachrichten-und-Filter.html</link>
            <category>Releases</category>
    
    <comments>http://th-h.de/blog/archives/1499-INN-Funktionsweise-Steuernachrichten-und-Filter.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1499</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1499</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Der Urlaub neigt sich endgültig seinem Ende zu, und - leider - ist die Todo-Liste, insbesondere hinsichtlich angedachter größerer Projekte, die man abends oder am Wochenende (zumindest bei meiner derzeitigen zeitlichen Belastung) nicht sinnvoll angehen kann, nicht merklich geschrumpft. Stattdessen habe ich mich (ungeplant) auf die Datensammlung zu Usenet-Hierarchien und danach dann auf den Umgang mit &lt;strong&gt;git&lt;/strong&gt; konzentriert und am Ende eine ganze Reihe Dinge umgesetzt, die auf der ToDo-Liste eigentlich gar nicht vorkamen. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;Nachdem Newsserver in den letzten Wochen eine so große Rolle gespielt haben ist es jetzt zum Abschluss nur recht und billig, wenn ich (nach mehrjähriger Pause) meine Seite zur &lt;a href=&quot;/infos/usenet/inn.php&quot; title=&quot;Funktionsweise des INN&quot;&gt;Funktionsweise des INN&lt;/a&gt; endlich um die noch fehlenden Teile ergänze; umso mehr, als ich meine Webseiten mittlerweile in ein &lt;em&gt;git&lt;/em&gt;-Repository eingecheckt habe und daher auch den Umgang damit üben kann, insbesondere, was fraktionierte Commits betrifft. Das ist eine sehr nette Sache: man nimmt eine Reihe unterschiedlicher Änderungen vor, die nichts miteinander zu tun haben - bspw. eine Ergänzung der INN-Beschreibung auf der einen Seite und Richtigstellungen/Tippfehlerkorrekturen, über die man zufällig stolpert, auf der anderen -, und kann diese Änderungen aber selektiv committen, bspw. zuerst nur die Ergänzungen, dann die Änderungen, dann die Rechtschreibfehler. Das macht die Commits übersichtlicher und ggf. auch leichter zu reverten, weil man nur logisch zusammengehörendes auch zusammen committet, ohne daß man beim Editieren darauf achten müßte.&lt;/p&gt; 
&lt;p&gt;Ich kann also hiermit verkünden, daß ich die Abschnitte über Steuernachrichten (&lt;em&gt;control.ctl&lt;/em&gt;), Filter und Reader-Authentifizierung sowie eine recht umfangreiche Linksammlung ergänzt habe. Fehlen nur noch Erläuterungen zum Expire, aber das muß ich erst einmal selbst verstehen. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Update 2010-01-26:&lt;/strong&gt; Inzwischen steht auch die Erläuterung zum Expire online. Die Seite ist damit - endlich! - fast fünf Jahre nach ihrer ersten Erstellung komplettiert. Ich hoffe, sie hilft dem einen oder anderen (vermißt wurden die fehlenden Teile allerdings offensichtlich nicht, wenn man nach dem erhaltenen Feedback über die Jahre geht ...).&lt;/p&gt;  
    </content:encoded>

    <pubDate>Sun, 17 Jan 2010 17:06:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1499-guid.html</guid>
    <category>git</category>
<category>inn</category>
<category>usenet</category>

</item>
<item>
    <title>gitweb mit Passwortschutz</title>
    <link>http://th-h.de/blog/archives/1530-gitweb-mit-Passwortschutz.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1530-gitweb-mit-Passwortschutz.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1530</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1530</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;em&gt;gitweb&lt;/em&gt; ist, wie &lt;a title=&quot;Git-Repositories mit gitosis und gitweb (Debian Lenny)&quot; href=&quot;http://th-h.de/blog/archives/1528-Git-Repositories-mit-gitosis-und-gitweb-Debian-Lenny.html&quot;&gt;vorgestern&lt;/a&gt; beschrieben, eine schöne Sache - aber nicht immer will man seine Repositories jedermann zugänglich machen. Schön wäre es doch, wenn man die Möglichkeit hätte, auch den Zugriff auf &lt;em&gt;gitweb&lt;/em&gt; an eine Anmeldung zu koppeln und so nur für befugte Benutzer zu erlauben. Eine Möglichkeit dazu will ich nachstehend schildern, orientiert an einem &lt;a title=&quot;Using apache authentication with gitweb, gitosis  repository access control&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1385&amp;amp;entry_id=1530&quot;  onmouseover=&quot;window.status=&#039;http://leho.kraav.com/blog/2009/10/27/using-apache-authentication-with-gitweb-gitosis-repository-access-control/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Beitrag&lt;/a&gt; im Blog von Leho Kraav.&lt;/p&gt;
&lt;p&gt;Weitere, vielleicht hilfreiche Anregungen dazu kann man ergoogeln, bspw.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1385&amp;amp;entry_id=1530&quot; title=&quot;http://leho.kraav.com/blog/2009/10/27/using-apache-authentication-with-gitweb-gitosis-repository-access-control/&quot;  onmouseover=&quot;window.status=&#039;http://leho.kraav.com/blog/2009/10/27/using-apache-authentication-with-gitweb-gitosis-repository-access-control/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Using apache authentication with gitweb, gitosis  repository access control&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1389&amp;amp;entry_id=1530&quot; title=&quot;http://git.madduck.net/v/gitweb-conf.git/blob/HEAD:/gitweb.conf&quot;  onmouseover=&quot;window.status=&#039;http://git.madduck.net/v/gitweb-conf.git/blob/HEAD:/gitweb.conf&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;madduck&#039;s gitweb.conf&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://th-h.de/blog/exit.php?url_id=1388&amp;amp;entry_id=1530&quot; title=&quot;http://markatharvest.blogspot.com/2009/04/securing-gitweb.html&quot;  onmouseover=&quot;window.status=&#039;http://markatharvest.blogspot.com/2009/04/securing-gitweb.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Securing gitweb&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;u.a.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Voraussetzung dafür ist eine ausreichend neue Version von &lt;em&gt;gitweb&lt;/em&gt;; die in Debian Lenny verfügbare Version 1.5.6.5 genügt nicht. Sie kann allerdings gepatcht werden (die Änderung ist minimal):&lt;/p&gt;
&lt;pre&gt;
--- /usr/lib/cgi-bin/gitweb.cgi.OLD 2010-01-14 16:49:44.000000000 +0100
+++ /usr/lib/cgi-bin/gitweb.cgi&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2010-01-15 15:30:40.975350737 +0100
@@ -86,6 +86,11 @@
&amp;#160;# (only effective if this variable evaluates to true)
&amp;#160;our $export_ok = &quot;&quot;;
 
+# show repository only if this subroutine returns true
+# when given the path to the project, for example:
+#&amp;#160;&amp;#160;&amp;#160; sub { return -e &quot;$_[0]/git-daemon-export-ok&quot;; }
+our $export_auth_hook = undef;
+
&amp;#160;# only allow viewing of repositories also shown on the overview page
&amp;#160;our $strict_export = &quot;&quot;;
 
@@ -353,7 +358,8 @@
&amp;#160;sub check_export_ok {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; my ($dir) = @_;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (check_head_link($dir) &amp;amp;&amp;amp;
-&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (!$export_ok || -e &quot;$dir/$export_ok&quot;));
+&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (!$export_ok || -e &quot;$dir/$export_ok&quot;) &amp;amp;&amp;amp;
+&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (!$export_auth_hook || $export_auth_hook-&amp;gt;($dir)));
&amp;#160;}
 
&amp;#160;# process alternate names for backward compatibility&lt;/pre&gt;
&lt;p&gt;Das vorausgesetzt, genügt es, die &lt;em&gt;gitweb.conf&lt;/em&gt; folgendermaßen zu erweitern:&lt;/p&gt;
&lt;pre&gt;
# HTTP Basic Auth
$gitosis_conf = &#039;/home/gitosis/.gitosis.conf&#039;;
$username = $cgi-&amp;gt;remote_user;
$export_auth_hook = sub {
&amp;#160; my $projectdir = shift;
&amp;#160; if($projectdir =~ (/(.*?)\.git/)) {
&amp;#160;&amp;#160;&amp;#160; #my $projectname = basename($1);
&amp;#160;&amp;#160;&amp;#160; my $projectname = $1;
&amp;#160;&amp;#160;&amp;#160; $projectname =~ s/$projectroot\/?//;
&amp;#160;&amp;#160;&amp;#160; open FILE, $gitosis_conf or die &#039;Could not open gitosis config file. Please make sure that $gitosis_conf is set properly&#039;;
&amp;#160;&amp;#160;&amp;#160; my $project_match = 0;
&amp;#160;&amp;#160;&amp;#160; my $user_match = 0;
&amp;#160;&amp;#160;&amp;#160; while(&amp;lt;FILE&amp;gt;) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if($_ =~ /^\s*members\s*\=\s*(?:.*?\s)*$username(?:\s+|$)/) {$user_match = 1;}
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if($_ =~ /^\s*(read|writ)able\s*\=\s*(?:.*?\s)*$projectname(?:\s+|$)/) {$project_match = 1;}
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if($project_match &amp;amp;&amp;amp; $user_match) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return 1;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if($_ =~ /\[group/) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $project_match = $user_match = 0;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }
&amp;#160;&amp;#160;&amp;#160; }
&amp;#160; }
&amp;#160; return 0;
};&lt;/pre&gt;
&lt;p&gt;Dann muß noch die Apache-Konfiguration passend erweitert werden, um HTTP-Basic-Authentication für das entsprechende Verzeichnis zu machen:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;Location /&amp;gt;
&amp;#160;AuthType Basic
&amp;#160;AuthName &quot;git.host.example&quot;
&amp;#160;AuthUserFile /home/gitosis/gitosis/ht.passwd
&amp;#160;Require valid-user
&amp;lt;/Location&amp;gt;&lt;/pre&gt;
&lt;p&gt;Pfade müssen, wie üblich, entsprechend angepaßt werden.&lt;/p&gt;
&lt;p&gt;Und schließlich müssen für die in der &lt;em&gt;gitosis.conf&lt;/em&gt; definierten Benutzer - jedenfalls diejenigen, die auch Webzugriff haben sollen - Paßworte in der &lt;em&gt;/home/gitosis/gitosis/ht.passwd&lt;/em&gt; angelegt werden. Dazu wird wie gewohnt &lt;em&gt;htpasswd&lt;/em&gt; bzw. &lt;em&gt;htpasswd2&lt;/em&gt; aufgerufen.&lt;/p&gt;
&lt;p&gt;Voilá!&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 16 Jan 2010 20:04:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1530-guid.html</guid>
    <category>anleitung</category>
<category>debian</category>
<category>git</category>
<category>lenny</category>

</item>
<item>
    <title>Git-Repositories mit gitosis und gitweb (Debian Lenny)</title>
    <link>http://th-h.de/blog/archives/1528-Git-Repositories-mit-gitosis-und-gitweb-Debian-Lenny.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1528-Git-Repositories-mit-gitosis-und-gitweb-Debian-Lenny.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1528</wfw:comment>

    <slash:comments>8</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1528</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Wie ich bereits &lt;a title=&quot;Patches für control-archive&quot; href=&quot;http://th-h.de/blog/archives/1498-Patches-fuer-control-archive.html&quot;&gt;schrieb&lt;/a&gt;, habe ich mich in den letzten Tagen etwas näher mit dem Versionskontrollsystem (VCS, oder auch SCM für &amp;#8220;Source-Code-Management&amp;#8221;) &lt;a title=&quot;Git&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1372&amp;amp;entry_id=1528&quot;  onmouseover=&quot;window.status=&#039;http://git-scm.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;git&lt;/a&gt; beschäftigt. Das macht natürlich nur bedingt Spaß - und Sinn -, wenn die Repositories nur auf dem heimischen Rechner liegen; um wirklich universal auf sie zugreifen zu können und auch die Zusammenarbeit mit anderen zu ermöglichen, sollten die Repositories irgendwo im Netz stehen, und eine nette Weboberfläche, die auch einen Zugriff über den Browser - ohne weitere Software - ermöglicht, um den aktuellen Stand der Bearbeitung zu sehen, Commits zu prüfen und ggf. einen Snapshot zu ziehen, wäre auch nicht schlecht.&lt;/p&gt;
&lt;p&gt;Um mir die Anlage von Repositories und das Zusammenspiel mit den anderen Komponenten zu erleichtern und auch für erweiterte Anforderungen wie verschiedene Zugriffsrechte für die jeweiligen Repositories gerüstet zu sein, habe ich mich für die Verwaltung der Repositories für &lt;em&gt;&lt;a title=&quot;gitosis&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1373&amp;amp;entry_id=1528&quot;  onmouseover=&quot;window.status=&#039;http://eagain.net/gitweb/?p=gitosis.git&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;gitosis&lt;/a&gt;&lt;/em&gt; entschieden; als Weboberfläche will ich &lt;em&gt;&lt;a title=&quot;gitweb&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1374&amp;amp;entry_id=1528&quot;  onmouseover=&quot;window.status=&#039;https://git.wiki.kernel.org/index.php/Gitweb&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;gitweb&lt;/a&gt;&lt;/em&gt; nutzen, und für den Zugriff via &lt;em&gt;git &lt;/em&gt;dann &lt;em&gt;git-daemon&lt;/em&gt;. Installiert habe ich dazu die jeweiligen Pakete aus Debian Lenny bzw. den Debian-Backports.&lt;/p&gt; &lt;p&gt;Die Installation und Konfiguration habe ich folgendermaßen durchgeführt:&lt;/p&gt;
&lt;h3&gt;1. gitosis&lt;/h3&gt;
&lt;h4&gt;a) Vorüberlegungen&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;gitosis &lt;/em&gt;bietet die Möglichkeit, Benutzer und Repositories zu konfigurieren. Die entsprechenden Repositories werden dann angelegt; für jedes kann gesondert festgelegt werden, welcher Benutzer - lesen oder schreibend - darauf zugreifen kann. Die Zugriffe erfolgen über (&lt;em&gt;git&lt;/em&gt;-über-)SSH; jeder Benutzer muß dazu seinen öffentlichen SSH-Schlüssel hinterlegen. Er verbindet sich dann unter dem Benutzernamen (Useraccount) &amp;#8220;gitosis&amp;#8221; per SSH mit dem Server, auf dem das Repository liegt; gitosis prüft dann, welcher SSH-Schlüssel für die Verbindung übergeben wird und identifiziert auf diese Weise den Benutzer.&lt;/p&gt;
&lt;p&gt;Die Konfiguration von &lt;em&gt;gitosis &lt;/em&gt;erfolgt gleichfalls über ein &lt;em&gt;git&lt;/em&gt;-Repository, das zunächst ausgecheckt wird; danach kann man die Konfiguration ändern und bspw. neue Repositories und Benutzer anlegen (und im Falle eines neuen Benutzers auch dessen öffentlichen SSH-Schlüssel speichern) und die Änderungen committen. Beim Commit paßt &lt;em&gt;gitosis&lt;/em&gt; über entsprechende Hooks die Konfiguration an. Das Konfigurations-Repository kann entweder auf denselben Rechner ausgecheckt werden oder auf einen beliebigen anderen Client; auch diese Verbindungen erfolgen über (&lt;em&gt;git&lt;/em&gt;-über-)SSH, und auch dafür muß man (s)einen öffentlichen SSH-Key bei &lt;em&gt;gitosis &lt;/em&gt;hinterlegen. Ich habe mich entschlossen, dafür einen eigenen Key anzulegen; man kann aber natürlich auch einfach (s)einen bestehenden SSH-Schlüssel verwenden.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Standardmäßig sieht das Debian-Paket von &lt;em&gt;gitosis&lt;/em&gt; die Anlage der Repositories in &lt;em&gt;/srv/gitosis&lt;/em&gt; an; das paßt allerdings nicht zur Partitionierung meines Mietservers, der - historisch und aus dem Image des Anbieters bedingt - platzmäßig eher knapp kalkulierte Partitionen bietet und den gesamten restlichen Plattenplatz in &lt;em&gt;/home&lt;/em&gt; eingehängt hat. Daher möchte ich die Repositories auch in &lt;em&gt;/home/gitosis&lt;/em&gt; liegen haben.&lt;/p&gt;
&lt;h4&gt;b) Installation (der Debian-Pakete) und Inbetriebnahme&lt;br /&gt;&lt;/h4&gt;
&lt;p&gt;Zunächst sind &lt;em&gt;git&lt;/em&gt; selbst und &lt;em&gt;gitosis&lt;/em&gt; zu installieren:&lt;/p&gt;
&lt;pre&gt;
aptitude install git-core git-doc gitosis&lt;/pre&gt;
&lt;p&gt;Danach lege ich ein Home-Verzeichnis für &lt;em&gt;gitosis&lt;/em&gt; in &lt;em&gt;/home&lt;/em&gt; an, lösche &lt;em&gt;/srv/gitosis&lt;/em&gt; und setze einen Symlink auf das Home-Verzeichnis:&lt;/p&gt;
&lt;pre&gt;
mkdir /home/gitosis
chown gitosis:gitosis /home/gitosis
rmdir /srv/gitosis/
ln -s /home/gitosis /srv/gitosis&lt;/pre&gt;
&lt;p&gt;Dann ist entweder mit &lt;em&gt;ssh-keygen&lt;/em&gt; ein neues Schlüsselpaar zu erzeugen oder der öffentliche Schlüssel eines bestehenden Schlüsselpaares in einer Datei bereitzulegen, bspw. in &lt;em&gt;git-admin_rsa.pub&lt;/em&gt;. Den verfüttert man dann an &lt;em&gt;gitosis&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;
sudo -H -u gitosis gitosis-init &amp;lt; git-admin_rsa.pub&lt;/pre&gt;
&lt;p&gt;Dann habe ich der Bequemlichkeit halber noch die Konfiguration des SSH-Clients angepaßt, um bei SSH-Verbindungen zu &lt;em&gt;localhost&lt;/em&gt; - was in meinem Fall nur für &lt;em&gt;git&lt;/em&gt;-über-SSH bei der Konfiguration von &lt;em&gt;gitosis&lt;/em&gt; vorkommt - direkt den richtigen Schlüssel zu benutzen, und dazu in &lt;em&gt;~/.ssh/config&lt;/em&gt; folgendes eingefügt:&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
Host localhost
IdentityFile ~/.ssh/git-admin_rsa&lt;/pre&gt;
&lt;p&gt;Zur Konfiguration und Einrichtung der Benutzer muß das Konfigurations-Repository von &lt;em&gt;gitosis&lt;/em&gt; jetzt erst einmal ausgecheckt werden (in meinem Falle geschieht das auf demselben Host, man kann aber natürlich auch von jedem anderen Host aus mit dem oben an &lt;em&gt;gitosis&lt;/em&gt; übergebenen SSH-Schlüssel auf das Repository zugreifen):&lt;/p&gt;
&lt;pre&gt;
git clone gitosis@localhost:gitosis-admin.git gitosis-admin&lt;/pre&gt;
&lt;p&gt;Damit wird das Repositoy in das Verzeichnis &lt;em&gt;gitosis-admin&lt;/em&gt; ausgecheckt. Dort befindet sich dann die Datei &lt;em&gt;gitosis.conf&lt;/em&gt; und das Verzeichnis &lt;em&gt;keydir&lt;/em&gt;; in ersterer werden Benutzer und Repositories angelegt, in letzterem finden sich die öffentlichen SSH-Schlüssel der Benutzer.&lt;/p&gt;
&lt;h4&gt;c) Konfiguration und Einrichtung der ersten Benutzer und Repositories&lt;/h4&gt;
&lt;p&gt;Als erstes nehme ich mir die &lt;em&gt;gitosis.conf&lt;/em&gt; vor und prüfe bzw. setze dort die globalen Einstellungen:&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;
[gitosis]
## To override the default ~/repositories path
# repositories = repositories

## Allow gitweb to show all known repositories. If you want gitweb,
## you need either this or a [repo foo] section for each repository
## you want visible in gitweb.
gitweb = no

## Allow git-daemon to publish all known repositories. As with gitweb,
## this can be done globally or per-repository.
daemon = no

## Logging level, one of DEBUG, INFO, WARNING, ERROR, CRITICAL
loglevel = INFO&lt;/pre&gt;
&lt;p&gt;Die Optionen sind im Prinzip selbsterklärend. Ich habe mich entschieden, den Webzugriff und den Zugriff via git-daemon nicht generell freizugeben, sondern das per Repository zu steuern.&lt;/p&gt;
&lt;p&gt;Als nächstes werden Benutzergruppen und deren Rechte festgelegt:&lt;/p&gt;
&lt;pre&gt;
### groups #####---------------
[group gitosis-admin]
writable = gitosis-admin
members = admin@admin.host.example

[group friends]
writable = repo-eins projekt/projektrepo-eins
members = me@my.host.example he@his.host.example another@another.host.example

[group myself]
writable = private projekt/projektrepo-private
members = me@my.host.example&lt;/pre&gt;
&lt;p&gt;Zur Gruppe &amp;#8220;gitosis-admin&amp;#8221; gehört also der Benutzer, der über den SSH-Key &amp;#8220;admin@admin.host.example&amp;#8221; identifiziert wird; dieser hat Zugriff auf das Konfigurations-Repository &amp;#8220;gitosis-admin&amp;#8221;. Zur Gruppe &amp;#8220;friends&amp;#8221; gehören neben mir (&amp;#8220;me@my.host.example&amp;#8221;)&amp;#160; auch noch zwei andere, und diese Gruppe hat Zugriff auf zwei verschiedene Repositories; zur Gruppe &amp;#8220;myself&amp;#8221; gehöre nur ich mit Zugriff auf zwei weitere Repositories. Statt Lese- und Schreibzugriff (&amp;#8220;writable&amp;#8221;) kann auch ein bloßer Lesezugriff vergeben werden.&lt;/p&gt;
&lt;p&gt;Diese Repositories werden dann im Anschluss konfiguriert:&lt;/p&gt;
&lt;pre&gt;
### repos #####----------------
[repo repo-eins]
## Oneline description of the project, mostly for gitweb.
description = Repository Number One
## Owner of this repository. Used in gitweb list of projects.
owner = John Doe
## Allow git-daemon to publish this repository.
daemon = yes
## Allow gitweb to show this repository.
gitweb = yes

[repo projekt/projektrepo-eins]
description = Repository for our project
owner = John Doe
daemon = yes
gitweb = yes

[repo private]
description = Private repository
owner = John Doe
daemon = no
gitweb = no

[repo projekt/projektrepo-private]
description = Another repository for our project
owner = John Doe
daemon = no
gitweb = no&lt;/pre&gt;
&lt;p&gt;Auch das sollte eigentlich selbsterklärend sein. Zu beachten ist, daß die Angaben unter &amp;#8220;daemon&amp;#8221; und &amp;#8220;gitweb&amp;#8221; nur steuern, ob gitosis eine entsprechende &amp;#8220;magische&amp;#8221; Datei &lt;em&gt;git-daemon-export-ok&lt;/em&gt; für &lt;em&gt;git-daemon&lt;/em&gt; anlegt bzw. das Repository in eine Projektdatei für &lt;em&gt;gitweb&lt;/em&gt; aufnimmt. Ob die entsprechenden mit &amp;#8220;yes&amp;#8221; gekennzeichneten Repositories dann via &lt;em&gt;gitweb &lt;/em&gt;oder &lt;em&gt;git-daemon&lt;/em&gt; auch wirklich verfügbar sind (und vor allem die mit &amp;#8220;no&amp;#8221; gekennzeichneten nicht!), ist eine Frage der Konfiguration dieser beiden Programme.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Nunmehr müssen für die in der &lt;em&gt;gitosis.conf&lt;/em&gt; definierten Benutzer noch jeweils deren öffentliche SSH-Key hinterlegt werden, und zwar in &lt;em&gt;keydir&lt;/em&gt;, wobei für jeden Nutzer eine Datei mit dem Namen &lt;em&gt;$nutzername.pub&lt;/em&gt; angelegt werden muß, die mindestens einen Schlüssel enthalten muß, aber auch mehrere Schlüssel enthalten darf. Der oder die Schlüssel des Nutzers &amp;#8220;me@my.host.example&amp;#8221; gehören also in die Datei &lt;em&gt;me@my.host.example.pub&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Schließlich müssen die Dateien mit dem Schlüsseln mittels &lt;em&gt;git add&lt;/em&gt; hinzugefügt und alle Änderungen mittes &lt;em&gt;git commit -a&lt;/em&gt; committed werden; danach wird das Repository mittels &lt;em&gt;git push&lt;/em&gt; an &lt;em&gt;gitosis&lt;/em&gt; verfüttert. Voilà!&lt;/p&gt;
&lt;h3&gt;2. git-daemon&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;git-daemon &lt;/em&gt;ist recht einfach zu installieren:&lt;/p&gt;
&lt;pre&gt;
aptitude install git-daemon-run&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;git-daemon-run&lt;/em&gt; verwendet allerdings nicht die gewohnten Scripts in &lt;em&gt;/etc/init.d&lt;/em&gt;, sondern &lt;em&gt;runit&lt;/em&gt;/&lt;em&gt;runsv&lt;/em&gt;, so dass sich ein Symlink lohnt:&lt;/p&gt;
&lt;pre&gt;
ln -s /usr/bin/sv /etc/init.d/git-daemon&lt;/pre&gt;
&lt;p&gt;Außerdem sollte &lt;em&gt;/etc/sv/git-daemon/run&lt;/em&gt; noch entsprechend konfiguriert werden:&lt;/p&gt;
&lt;pre&gt;
#!/bin/sh
exec 2&amp;gt;&amp;amp;1
echo &amp;#8216;git-daemon starting.&amp;#8217;
exec chpst -ugitdaemon /usr/lib/git-core/git-daemon --verbose --enable=upload-pack --enable=upload-archive --base-path=/home/gitosis/repositories /home/gitosis/repositories&lt;/pre&gt;
&lt;p&gt;Statt &amp;#8220;-ugitdaemon&amp;#8221; wäre ggf. bei neueren Versionen des &lt;em&gt;gitosis&lt;/em&gt;-Pakets in Debian &amp;#8220;-ugitosis&amp;#8221; zu verwenden; der Pfad &lt;em&gt;/home/gitosis/repositories&lt;/em&gt; ist (zweimal) ggf. durch den Pfad zu den in &lt;em&gt;gitosis&lt;/em&gt; angelegten Repositories zu ersetzen, im Falle des Debian-Paketes standardmäßig &lt;em&gt;/srv/gitosis&lt;/em&gt; (den Grund für meine diesbezügliche Änderung habe ich weiter oben beschrieben).&lt;/p&gt;
&lt;p&gt;Schließlich muß man sich noch entscheiden, welche Services der &lt;em&gt;git-daemon&lt;/em&gt; bieten soll. &amp;#8220;upload-pack&amp;#8221; erlaubt den Zugriff via &lt;em&gt;git fetch&lt;/em&gt;, &lt;em&gt;git pull&lt;/em&gt; und &lt;em&gt;git clone&lt;/em&gt;, &amp;#8220;upload-archive&amp;#8221; die Verwendung von &lt;em&gt;git archive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Das sollte es dann gewesen sein.&lt;/p&gt;
&lt;h3&gt;3. gitweb&lt;/h3&gt;
&lt;p&gt;Das &lt;em&gt;gitweb&lt;/em&gt;-Paket aus Debian Lenny kann gleichfalls in wenigen Schritten installiert und konfiguriert werden; danach ist nur noch der Webserver - in meinem Fall &lt;em&gt;Apache 2.2&lt;/em&gt; - entsprechend anzupassen, wobei ich für &lt;em&gt;gitweb &lt;/em&gt;einen eigenen vhost aufgesetzt habe.&lt;/p&gt;
&lt;h4&gt;a) gitweb &lt;br /&gt;&lt;/h4&gt;
&lt;pre&gt;
aptitude install gitweb&lt;/pre&gt;
&lt;p&gt;Dann kommt die &lt;em&gt;/etc/gitweb.conf&lt;/em&gt; an die Reihe:&lt;/p&gt;
&lt;pre&gt;
# path to git projects (&amp;lt;project&amp;gt;.git)
#$projectroot = &amp;#8220;/var/cache/git&amp;#8221;;
$projectroot = &amp;#8220;/home/gitosis/repositories/&amp;#8221;;

# directory to use for temp files
$git_temp = &amp;#8220;/tmp&amp;#8221;;

# target of the home link on top of all pages
#$home_link = $my_uri || &amp;#8220;/&amp;#8221;;

# html text to include at home page
$home_text = &amp;#8220;indextext.html&amp;#8221;;

# file with project list; by default, simply scan the projectroot dir.
# $projects_list = $projectroot;

# Point to projects.list file generated by gitosis.
$projects_list = &amp;#8220;/home/gitosis/gitosis/projects.list&amp;#8221;;

# stylesheet to use
$stylesheet = &amp;#8220;/gitweb.css&amp;#8221;;

# logo to use
$logo = &amp;#8220;/git-logo.png&amp;#8221;;

# the &amp;#8216;favicon&amp;#8217;
$favicon = &amp;#8220;/git-favicon.png&amp;#8221;;

# A list of base urls where all the repositories can be cloned from.
# Easier than having per-repository cloneurl files.
@git_base_url_list = (&amp;#8217;git://git.host.example&amp;#8217;);&lt;/pre&gt;
&lt;p&gt;&amp;#8220;$projectroot&amp;#8221; ist hier der Pfad zu den von &lt;em&gt;gitosis &lt;/em&gt;angelegten Repositories, standardmäßig &lt;em&gt;/srv/gitosis/repositories&lt;/em&gt;; &amp;#8220;$projects_list&amp;#8221; umfasst die Repositories, die &lt;em&gt;gitweb &lt;/em&gt;anzeigen soll, und ist entweder ein Verzeichnis (bspw. &lt;em&gt;$projectroot&lt;/em&gt;), in dem die Repositories liegen, &lt;u&gt;oder&lt;/u&gt; eine Datei mit einer Liste der Repositories. Wenn man hier die Funktionalität von &lt;em&gt;gitosis &lt;/em&gt;nutzen will, in der &lt;em&gt;gitosis.conf&lt;/em&gt; zu steuern, welche Repositories &lt;em&gt;gitweb &lt;/em&gt;anzeigen soll, dann ist es wichtig, hier auf die von &lt;em&gt;gitosis&lt;/em&gt; erzeugte Projektliste zu verweisen, wie im obigen Beispiel geschehen! Wenn man sicherstellen will, daß &lt;em&gt;gitweb &lt;/em&gt;nicht nur die &lt;strong&gt;Anzeige&lt;/strong&gt; der Repositories auf die in der Liste gezeigten beschränkt, sondern auch nur diese Repositories überhaupt zum Abruf über das Webinterface anbietet, muß die Konfiguration hier noch um&lt;/p&gt;
&lt;pre&gt;
$strict_export = &amp;#8220;true&amp;#8221;;&lt;/pre&gt;
&lt;p&gt;ergänzt werden. Schließlich können noch allgemeine Parameter wie &amp;#8220;@git_base_url_list&amp;#8221; gesetzt werden.&lt;/p&gt;
&lt;h4&gt;b) apache2 &lt;br /&gt;&lt;/h4&gt;
&lt;p&gt;Für den Webserver konfiguriere ich, wie einleitend beschrieben, einen eigenen vhost in &lt;em&gt;/etc/apache2/sites-available/gitweb&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;VirtualHost *:80&amp;gt;
 ServerName git.host.example
&amp;#160;ServerAdmin webmaster@host.example

 HeaderName HEADER

 # bogus but safe DocumentRoot
 DocumentRoot /var/cache/git

 #Alias /robots.txt /var/www/cvs.robots.txt
 Alias /gitweb.css /usr/share/gitweb/gitweb.css
 Alias /git-favicon.png /usr/share/gitweb/git-favicon.png
 Alias /git-logo.png /usr/share/gitweb/git-logo.png
 ScriptAlias / /usr/lib/cgi-bin/gitweb.cgi
&amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;
&lt;p&gt;Ich füge außerdem den Benutzer &lt;em&gt;www-data&lt;/em&gt;, unter dem der Apache-Webserver läuft, noch in &lt;em&gt;/etc/group&lt;/em&gt; zur Gruppe &lt;em&gt;gitosis&lt;/em&gt; hinzu, damit er die Repositories lesen kann.&lt;/p&gt;
&lt;p&gt;Danach aktiviere ich den zuvor angelegten vhost:&lt;/p&gt;
&lt;pre&gt;
a2ensite gitweb
/etc/init.d/apache2 reload&lt;/pre&gt;
&lt;p&gt;Jetzt sollte unter &lt;em&gt;http://git.host.example/&lt;/em&gt; das Webinterface von gitweb mit den freigegebenen - und befüllten! - Repositories auftauchen.&lt;/p&gt;
&lt;p&gt;Fertig! &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 14 Jan 2010 18:41:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1528-guid.html</guid>
    <category>anleitung</category>
<category>debian</category>
<category>git</category>
<category>lenny</category>

</item>
<item>
    <title>Patches für control-archive</title>
    <link>http://th-h.de/blog/archives/1498-Patches-fuer-control-archive.html</link>
            <category>On the net</category>
    
    <comments>http://th-h.de/blog/archives/1498-Patches-fuer-control-archive.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1498</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1498</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Ich hatte ja bereits darüber berichtet, daß mich der simple Wunsch, meinen Newsserver etwas aufzuräumen, über den Umweg über die &lt;a title=&quot;List of Usenet public managed hierarchies&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1363&amp;amp;entry_id=1498&quot;  onmouseover=&quot;window.status=&#039;http://usenet.trigofacile.com/hierarchies/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;List of Usenet public managed hierarchies&lt;/a&gt; auf eine mehrwöchige Tour durch die &lt;a href=&quot;http://th-h.de/blog/archives/1483-Deutschsprachige-regionale-Usenet-Hierarchien.html&quot; title=&quot;Deutschsprachige regionale Usenet-Hierarchien&quot;&gt;deutschsprachigen Regionalhierarchien&lt;/a&gt; geschickt, zum Aufbau von &lt;a title=&quot;DE-Regio&quot; href=&quot;/de-regio/&quot;&gt;De-Regio&lt;/a&gt; und zur Installation von &lt;a href=&quot;http://th-h.de/blog/archives/1485-git.html&quot; title=&quot;Git&quot;&gt;&lt;strong&gt;git&lt;/strong&gt;&lt;/a&gt; gebracht hatte. Mittlerweile habe ich mich hinreichend sortiert, um für das &lt;a title=&quot;control-archive&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1367&amp;amp;entry_id=1498&quot;  onmouseover=&quot;window.status=&#039;http://www.eyrie.org/~eagle/software/control-archive/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;&lt;em&gt;control-archive&lt;/em&gt;&lt;/a&gt;-Paket eine ganze Reihe von Änderungen einzureichen, die ich nun in Form von git-Patches gebracht und per Mail an den Maintainer verschickt habe; mehr oder weniger das erste Mal, daß ich auf diese Weise irgendwo einen Beitrag leiste. Mal schauen, ob die Patches akzeptiert werden.&lt;/p&gt; 
&lt;p&gt;Mit &lt;strong&gt;git&lt;/strong&gt; muß ich mich aber definitiv noch näher beschäftigen, sofern es da auch etwas unter Windows gibt; das scheint mir endlich mal ein VCS zu sein, mit dem ich klarkomme. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt;  
    </content:encoded>

    <pubDate>Tue, 12 Jan 2010 22:53:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1498-guid.html</guid>
    <category>de-regio</category>
<category>git</category>
<category>usenet</category>

</item>
<item>
    <title>git</title>
    <link>http://th-h.de/blog/archives/1485-git.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>http://th-h.de/blog/archives/1485-git.html#comments</comments>
    <wfw:comment>http://th-h.de/blog/wfwcomment.php?cid=1485</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://th-h.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1485</wfw:commentRss>
    

    <author>thh@inter.net (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Nein, nicht &amp;#8220;igitt&amp;#8221;! Git. (iGit wäre vermutlich die Apple-Variante.)&lt;/p&gt;
&lt;p&gt;Nachdem gestern Russ Albery auf meine Frage, in welchem Format denn Änderungen für das &lt;em&gt;control.ctl&lt;/em&gt; (siehe dazu auch meinen vorigen Beitrag) am besten eingereicht werden sollten, mit&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone who&amp;#8217;s really inspired can send me Git patches against the repository at git://git.eyrie.org/usenet/control.git, of course. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a title=&quot;Posting in news.admin.hierarchies&quot; href=&quot;http://th-h.de/blog/exit.php?url_id=1342&amp;amp;entry_id=1485&quot;  onmouseover=&quot;window.status=&#039;http://al.howardknight.net/msgid.cgi?ID=126876931700&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;geantwortet&lt;/a&gt; hatte, war mein Ehrgeiz geweckt; schließlich plane ich nach Abschluss meiner &amp;#8220;Forschungen&amp;#8221; über die deutschsprachigen Regionalhierarchien eine Zusammenstellung der dann vermutlich eher umfangreichen Änderungen einzureichen, und warum sollte ich das dann nicht direkt richtig professionell versuchen? Außerdem wollte ich mich seit Jahren immer schon mal wieder mit Versionsverwaltungssystemen beschäftigen, bin aber bisher nie über die eher theoretischen Konzepte - konkret von SVN - herausgekommen. Warum also nicht jetzt einen neuen Versuch wagen?&lt;/p&gt;
&lt;p&gt;Daher habe ich etwas gegoogelt, mir &lt;em&gt;git&lt;/em&gt; heruntergeladen (naja, genauer gesagt das passende Debian-Paket &lt;em&gt;git-core&lt;/em&gt; installiert), das Repository ausgecheckt und festgestellt, daß das eigentlich eine recht einfache Sache zu sein scheint. Mal gucken, wie ich dann auch tatsächlich damit zurechtkomme. &lt;img src=&quot;http://th-h.de/blog/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; Bevor es soweit ist, dürften ja auch noch einige Recherchen anstehen (und der Versuch, die Ergebnisse praktikabel zusammenzustellen und zu präsentieren; meine erste Idee, eine statische HTML-Seite zu bauen, hat sich jedenfalls eindeutig nicht bewährt).&lt;br /&gt;&lt;/p&gt;  
    </content:encoded>

    <pubDate>Sun, 03 Jan 2010 20:51:00 +0100</pubDate>
    <guid isPermaLink="false">http://th-h.de/blog/archives/1485-guid.html</guid>
    <category>git</category>

</item>

</channel>
</rss>