<?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>Netz - Rettung - Recht (Artikel mit Tag git)</title>
    <link>https://netz-rettung-recht.de/</link>
    <description>Netzleben, Rettungs- und Rechtswesen</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 2.5.0 - http://www.s9y.org/</generator>
    <pubDate>Mon, 30 Mar 2020 06:38:07 GMT</pubDate>

    <image>
    <url>https://netz-rettung-recht.de/templates/2k11/img/s9y_banner_small.png</url>
    <title>RSS: Netz - Rettung - Recht - Netzleben, Rettungs- und Rechtswesen</title>
    <link>https://netz-rettung-recht.de/</link>
    <width>100</width>
    <height>21</height>
</image>

<item>
    <title>FLOSS'n'net - Aktivitäten 09/2018</title>
    <link>https://netz-rettung-recht.de/archives/2115-FLOSSnnet-Aktivitaeten-092018.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2115-FLOSSnnet-Aktivitaeten-092018.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2115</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2115</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Im September 2018 hatte ich mal wieder ein wenig Zeit gefunden, mich mit dem einen oder anderen Projekt rund um freie Software (&lt;a href=&quot;https://de.wikipedia.org/wiki/Free/Libre_Open_Source_Software&quot; title=&quot;&quot;&gt;FLOSS&lt;/a&gt;) oder das Netz zu beschäftigen.&lt;/p&gt;

&lt;p&gt;Dabei habe ich folgendes beigetragen:&lt;/p&gt;

&lt;h3 id=&quot;faqs-anleitungen-und-tutorials&quot;&gt;FAQs, Anleitungen und Tutorials&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://th-h.de/net/misc/git/installation/&quot; title=&quot;Installation von git for Windows | th-h.de&quot;&gt;Installationsanleitung für &lt;em&gt;git for Windows&lt;/em&gt;&lt;/a&gt; auf &lt;em&gt;th-h.de&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;serendipity-s9y-&quot;&gt;Serendipity (&lt;em&gt;s9y&lt;/em&gt;)&lt;/h3&gt;

&lt;p&gt;Ein Großteil meiner Aktivität betraf das Blogsystem &lt;a href=&quot;https://docs.s9y.org/&quot; title=&quot;Serendipity -  A reliable, secure and extensible PHP blog | Serendipity Blog System&quot;&gt;&lt;em&gt;Serendipity&lt;/em&gt;&lt;/a&gt;, mit dem auch dieses Blog betrieben wird.&lt;/p&gt;

&lt;h4 id=&quot;-s9y-kern&quot;&gt;&lt;em&gt;s9y&lt;/em&gt;-Kern&lt;/h4&gt;

&lt;p&gt;Im Core habe ich nur ein wenig sortiert und aufgeräumt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/575&quot; title=&quot;[2k11] Update links in admin overview. by th-h · Pull Request #575 · s9y/Serendipity · GitHub&quot;&gt;Update links in admin overview.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/578&quot; title=&quot;Change message for auto-moderation after X days. by th-h · Pull Request #578 · s9y/Serendipity · GitHub&quot;&gt;Change message for auto-moderation after X days.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/582&quot; title=&quot;[spamblock] Remove dead code (Akismet spam toggle). by th-h · Pull Request #582 · s9y/Serendipity · GitHub&quot;&gt;Remove dead code (Akismet spam toggle).&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/579&quot; title=&quot;Check NEWS, remove duplicate items. by th-h · Pull Request #579 · s9y/Serendipity · GitHub&quot;&gt;Check NEWS, remove duplicate items.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;plugins&quot;&gt;Plugins&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ich habe einen Bug im Plugin &lt;em&gt;serendipity_event_dsgvo_gdpr&lt;/em&gt; behoben, der in den meisten Fällen die Anzeige der durch Plugins verarbeiteten Daten verhindert hat.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/additional_plugins/pull/86&quot; title=&quot;[event_dsgvo_gdpr] Display plugin legal info. by th-h · Pull Request #86 · s9y/additional_plugins · GitHub&quot;&gt;&lt;em&gt;Display plugin legal info.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Außerdem habe ich eine Formulierung im &lt;em&gt;Cookie-Consent&lt;/em&gt;-Modul des Plugins der Rechtslage angepasst.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/additional_plugins/pull/83&quot; title=&quot;Cookie Consent: &amp;quot;understood&amp;quot;, not &amp;quot;accepted&amp;quot;. by th-h · Pull Request #83 · s9y/additional_plugins · GitHub&quot;&gt;&lt;em&gt;Cookie Consent: &amp;#8220;understood&amp;#8221;, not &amp;#8220;accepted&amp;#8221;.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Schon lange hat mich geärgert, dass &lt;em&gt;serendipity_event_markdown&lt;/em&gt; keine Zitate in Kommentaren unterstützt, die in Markdown mit &lt;code&gt;&amp;gt;&lt;/code&gt; eingeleitet werden. Bei näherer Betrachtung wurde mir bewusst, dass das an &lt;em&gt;serendipity_event_unstrip_tags&lt;/em&gt; liegt, das HTML in Kommentaren als Text anzeigt und zu diesem Zweck &lt;code&gt;&amp;lt;&lt;/code&gt; und &lt;code&gt;&amp;gt;&lt;/code&gt; durch die entsprechenden Entities ersetzt. Das muss &lt;em&gt;serendipity_event_markdown&lt;/em&gt; also rückgängig machen, aber nur dann, wenn es sich wirklich um ein Zitatzeichen handelt. Ich habe das mit einem regulären Ausdruck gelöst.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/additional_plugins/pull/88&quot; title=&quot;[markdown] Make blockquotes in comments usable. by th-h · Pull Request #88 · s9y/additional_plugins · GitHub&quot;&gt;&lt;em&gt;Make blockquotes in comments usable.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Die meisten &lt;em&gt;s9y&lt;/em&gt;-Plugins werden über &lt;em&gt;Spartacus&lt;/em&gt; installiert; einige wenige Plugins befinden sich im Core, werden also mit &lt;em&gt;s9y&lt;/em&gt; zusammen installiert und auch nur mit &lt;em&gt;s9y&lt;/em&gt; zusammen aktualisiert. Das gilt zum Beispiel für das &lt;em&gt;Spartacus&lt;/em&gt;-Plugin; könnte man dieses nur über &lt;em&gt;Spartacus&lt;/em&gt; installieren, wäre das ein &lt;a href=&quot;https://de.wikipedia.org/wiki/Catch-22_(Dilemma)&quot; title=&quot;&quot;&gt;Catch-22&lt;/a&gt;. Manche Plugins aber finden sich &lt;em&gt;sowohl&lt;/em&gt; im Core &lt;em&gt;als auch&lt;/em&gt; in &lt;em&gt;Spartacus&lt;/em&gt; und sollten daher nur an einer Stelle - nämlich in &lt;em&gt;Spartacus&lt;/em&gt; - aktualisiert und dann einfach in den Core kopiert werden. Das ist nicht immer beachtet worden, so dass sich im Core und in &lt;em&gt;Spartacus&lt;/em&gt; teilweise unterschiedliche Versionen mit unterschiedlichen Änderungen befanden. Das habe ich behoben und die betroffenen Plugins synchronisiert sowie &lt;a href=&quot;https://github.com/s9y/Serendipity/wiki/Development-on-branches#plugin-locations-repositories&quot; title=&quot;Development on branches · s9y/Serendipity Wiki · GitHub&quot;&gt;im Entwickler-Wiki dokumentiert&lt;/a&gt;.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/Serendipity/pull/573&quot; title=&quot;Sync plugins in core and Spartacus. by th-h · Pull Request #573 · s9y/Serendipity · GitHub&quot;&gt;&lt;em&gt;Sync plugins in core and Spartacus.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;webseiten&quot;&gt;Webseiten&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Wir blenden auf der Startseite der &lt;em&gt;s9y&lt;/em&gt;-Webseiten die aktuellsten Beiträge aus dem &lt;em&gt;s9y&lt;/em&gt;-Blog ein. Das funktionierte nicht mehr. Nach stundenlangem Debugging weiß ich immer noch nicht genau, warum - aber der Wechsel vom RSS- auf dem Atom-Feed hat das Proble behoben (&amp;#8220;gelöst&amp;#8221; ist vielleicht das falsche Wort dafür).&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/s9y.github.io/pull/70&quot; title=&quot;Switch news feed from blog to atom feed. by th-h · Pull Request #70 · s9y/s9y.github.io · GitHub&quot;&gt;&lt;em&gt;Switch news feed from blog to atom feed.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Außerdem habe ich ein zwei Jahre altes Versprechen eingelöst und mich um eine Breadcrumb-Navigation in der &lt;em&gt;s9y&lt;/em&gt;-Dokumentation gekümmert.&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/s9y.github.io/pull/71&quot; title=&quot;Add breadcrumb navigation to docs. by th-h · Pull Request #71 · s9y/s9y.github.io · GitHub&quot;&gt;&lt;em&gt;Add breadcrumb navigation to docs.&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/s9y/website_assets/pull/4&quot; title=&quot;Add CSS for breadcrumbs. by th-h · Pull Request #4 · s9y/website_assets · GitHub&quot;&gt;&lt;em&gt;Add CSS for breadcrumbs.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Viel war&amp;#8217;s nicht, aber ich bin immer froh, wenn ich wenigstens alle paar Monate einmal einige Stunden Zeit finde, mich durch Texte, Bugreports oder Code an der Weiterentwicklung freier Software (im weitesten Sinne: des Netzes) zu beteiligen.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/536f65a5a6ec49c88ddd878395db1798&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 18 Oct 2018 16:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2115-guid.html</guid>
    <category>flossnet</category>
<category>git</category>
<category>s9y</category>

</item>
<item>
    <title>Installationsanleitung für &quot;git for Windows&quot;</title>
    <link>https://netz-rettung-recht.de/archives/2108-Installationsanleitung-fuer-git-for-Windows.html</link>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/2108-Installationsanleitung-fuer-git-for-Windows.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2108</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2108</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;https://th-h.de/net/misc/git/&quot; title=&quot;Versionsverwaltung mit git | th-h.de&quot;&gt;&lt;em&gt;git&lt;/em&gt;&lt;/a&gt; ist bekanntlich das von mir seit 2010 genutzte Versionsverwaltungssystem, über das ich auch hier im Blog schon verschiedentlich berichtet habe. Allerdings sind diese Einträge zumeist sieben oder acht Jahre alt und nicht mehr auf dem aktuellen Stand. Grund genug, ihre Inhalte allmählich in meine Webseiten zu überführen, wo sie eigentlich ja auch hingehören.&lt;/p&gt;

&lt;p&gt;Angefangen habe ich jetzt mit einer - bebilderten - &lt;a href=&quot;https://th-h.de/net/misc/git/installation/&quot; title=&quot;Installation von git for Windows | th-h.de&quot;&gt;Installationsanleitung&lt;/a&gt; für &lt;em&gt;git for Windows&lt;/em&gt;.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Thu, 04 Oct 2018 05:56:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2108-guid.html</guid>
    <category>git</category>

</item>
<item>
    <title>Github: alte TLS-Versionen und SSH-Algorithmen deaktiviert</title>
    <link>https://netz-rettung-recht.de/archives/2062-Github-alte-TLS-Versionen-und-SSH-Algorithmen-deaktiviert.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2062-Github-alte-TLS-Versionen-und-SSH-Algorithmen-deaktiviert.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2062</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2062</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;em&gt;Github&lt;/em&gt; hat am 22.02.2018 Änderungen an der &lt;em&gt;HTTPS&lt;/em&gt;-und &lt;em&gt;SSH&lt;/em&gt;-Konfiguration vorgenommen und ältere und weniger sichere &lt;a href=&quot;https://githubengineering.com/crypto-removal-notice/&quot; title=&quot;Redirecting&amp;hellip;&quot;&gt;Zugriffsmöglichkeiten deaktiviert&lt;/a&gt;. Das betrifft sowohl &lt;em&gt;TLS 1.0&lt;/em&gt; und &lt;em&gt;TLS 1.1&lt;/em&gt; als auch - für den &lt;em&gt;SSH&lt;/em&gt;-Schlüsselaustauch - &lt;em&gt;diffie-hellman-group1-sha1 und *diffie-hellman-group14-sha1&lt;/em&gt;. Wenn die verwendete Client-Software nicht mindestens &lt;em&gt;TLS 1.2&lt;/em&gt; bzw. einen anderen Schlüsselaustausch-Algorithmus beherrscht, muss man mithin aktiv werden.&lt;/p&gt;

&lt;p&gt;Wer - wie ich - &lt;em&gt;&lt;a href=&quot;https://gitforwindows.org/&quot; title=&quot;Git for Windows&quot;&gt;Git for Windows&lt;/a&gt;&lt;/em&gt; zusammen mit &lt;em&gt;PLink&lt;/em&gt; aus dem &lt;em&gt;Putty&lt;/em&gt;-Paket als &lt;em&gt;SSH&lt;/em&gt;-Client verwendet, bekommt sonst möglicherweise - wenn er &lt;em&gt;Putty&lt;/em&gt; länger nicht mehr geupdatet hat - beim &lt;code&gt;git pull&lt;/code&gt; oder &lt;code&gt;git push&lt;/code&gt; eine Meldung dieser Art zu sehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;FATAL ERROR: Couldn&#039;t agree a key exchange algorithm (available: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Natürlich (?) hatte ich die Ankündigungen über die Änderungen bei Github nicht präsent, vermutete aber etwas in der Art - und Google führte mich nach einiger Zeit zu einem &lt;a href=&quot;https://github.com/desktop/desktop/issues/4105&quot; title=&quot;Authentication failed when pushing to my repository · Issue #4105 · desktop/desktop · GitHub&quot;&gt;Issue&lt;/a&gt; im Github-Desktop-Projekt. Und siehe da - &lt;em&gt;Putty&lt;/em&gt; kann erst ab Version &lt;em&gt;0.68&lt;/em&gt; (21.02.2017) elliptische Kurven:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Support for elliptic-curve cryptography (the NIST curves and 25519), for host keys, user authentication keys, and key exchange.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ein &lt;em&gt;putty&lt;/em&gt;-Update später flutschte dann auch wieder alles.&lt;/p&gt;

&lt;p&gt;(Ab dieser Version wird allerdings ggf. eine 64bit-Version von &lt;em&gt;Putty&lt;/em&gt; installiert, die dann unter Windows nicht in &lt;code&gt;C:\Program Files (x86)&lt;/code&gt; landet, sondern in &lt;code&gt;C:\Program Files&lt;/code&gt;, so dass ggf. die Umgebungsvariable &lt;code&gt;GIT_SSH&lt;/code&gt; angepasst werden muss.)&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Tue, 03 Apr 2018 04:40:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2062-guid.html</guid>
    <category>git</category>
<category>ssh</category>
<category>ssl</category>

</item>
<item>
    <title>Zeitstempel von Dateien unter Versionsverwaltung</title>
    <link>https://netz-rettung-recht.de/archives/2052-Zeitstempel-von-Dateien-unter-Versionsverwaltung.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2052-Zeitstempel-von-Dateien-unter-Versionsverwaltung.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2052</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2052</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Die Verwaltung von Dateien in einem Versionskontrollsystem (VCS) wie &lt;em&gt;git&lt;/em&gt; hat einen Nachteil: der Zeitstempel im Dateisystem gibt nicht mehr den Zeitpunkt der letzten Änderung an dieser Datei wieder, sondern den Zeitpunkt, zu dem sie zuletzt (ggf. mit vielen anderen Dateien) ausgecheckt wurde.&lt;/p&gt;

&lt;p&gt;Für Webseiten bedeutet das, dass man für die Ausgabe des Datums der letzten Änderung nicht mehr auf den Zeitstempel der entsprechenden Datei zurückgreifen kann. Das macht mir nichts aus, denn zum einen verwende ich mittlerweile weitgehend statische Webseiten, bei denen das ohnehin nicht ohne weiteres möglich wäre, und zum anderen bringt dieser Ansatz zwar den Vorteil der Automatisierung mit sich, aber zugleich den - aus meiner Sicht überwiegenden - Nachteil, dass jeder verbesserte Tippfehler, jede unsichtbare Änderung am Seitengerüst als &amp;#8220;Update&amp;#8221; vermerkt wird, obwohl der Inhalt möglicherweise weiterhin völlig veraltet ist. Ich ziehe es daher vor, selbst zu entscheiden, was als &amp;#8220;Änderung&amp;#8221; gilt, und dann das Datum der letzten Änderung selbst zu setzen.&lt;/p&gt;

&lt;p&gt;So weit, so gut - aber wie sieht das mit Downloaddateien aus?&lt;/p&gt;

&lt;h3 id=&quot;zeitstempel-von-downloadangeboten-passend-setzen&quot;&gt;Zeitstempel von Downloadangeboten passend setzen&lt;/h3&gt;

&lt;p&gt;Jedenfalls dann, wenn man Downloadangebote nicht nur verlinkt, sondern den Downloadbereich auch als Dateiübersicht zugänglich macht - wie ich es &lt;a href=&quot;https://th-h.de/archives/&quot; title=&quot;Index of /archives&quot;&gt;auf meinen Webseiten&lt;/a&gt; tue -, ist es für den Nutzer gelinde gesagt verwirrend, wenn der angezeigte Zeitstempel der Dateien nichts mit der letzten Änderung derselben zu tun hat.&lt;/p&gt;

&lt;p&gt;Dafür gibt es natürlich verschiedene einfache Lösungen: Zum einen könnte ich darauf verzichten, einen Downloadbereich in diesem Sinne anzuzeigen, und die Dateien einfach nur verlinken. Tatsächlich sind die meisten Downloadangebote irgendwo auf meinen Seiten verlinkt, und ich speichere für sie auch Metadaten wie bspw. das Datum der letzten Änderung, das bei dem Link angezeigt wird, wie bspw. bei meinen &lt;a href=&quot;https://th-h.de/rescue/#downloads&quot; title=&quot;Rund um das Rettungswesen | th-h.de&quot;&gt;Downloads aus dem Bereich des Rettungswesens&lt;/a&gt;. Ich schätze es aber gerade, dass man in den Downloadangeboten auch &amp;#8220;einfach so&amp;#8221; stöbern kann. - Zum anderen könnte ich darauf verzichten, Downloads unter Versionskontrolle zu stellen, und sie in einem gesonderten Archiv speichern. Gerade für Software-Releases - und auch meine FAQs - wäre das vernünftig; beide werden ohnehin in gesonderten &lt;em&gt;git&lt;/em&gt;-Repositories versioniert, so dass es nicht erforderlich ist, einzelne Releases nochmal im Repository meiner Webseiten zu speichern. Andererseits gibt es aber Downloads, die nicht selbst unter Versionskontrolle stehen, und - mir viel wichtiger - eine getrennte Speicherung der Downloadangebote würde bedeuten, dass ich meine Webseiten nicht &amp;#8220;aus einem Guss&amp;#8221; aus dem &lt;em&gt;git&lt;/em&gt;-Repository erzeugen bzw. wiederherstellen kann; ich müsste dann den Downloadbereich getrennt sichern und einspielen.&lt;/p&gt;

&lt;p&gt;Trotz allem denke ich regelmäßig darüber nach, die Downloadangebote aus der Versionskontrolle herauszunehmen (das ist ja ein wenig auch eine Frage der Größe des Repositories). Bis dahin wollte ich aber eine andere Lösung für das Problem der &amp;#8220;falschen&amp;#8221; Zeitstempel im Directory-Listing - und eigentlich kann das so schwierig ja nicht sein: immerhin &lt;em&gt;habe&lt;/em&gt; ich Metadaten, aus denen sich für jede einzelne Datei im Downloadbereich das Datum der letzten (inhaltlichen) Änderung ergibt. Wie schwer kann es sein, den Zeitstempel - also das Datum der letzten Änderung der Datei im Dateisystem, die sog. &lt;em&gt;modification time&lt;/em&gt; oder kurz &lt;em&gt;mtime&lt;/em&gt; - passend zu setzen?&lt;/p&gt;

&lt;p&gt;Wie sich herausstellt: nicht sehr schwer. Es genügt, ein paar Zeilen als &lt;code&gt;postprocess&lt;/code&gt;-Block in der &lt;em&gt;Nanoc&lt;/em&gt;-Konfiguration hinzuzufügen:&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;postprocess &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# iterate over all items starting with /archives/ or /net/usenet/faqs/ with kind &amp;amp;#8220;file&amp;amp;#8221; or &amp;amp;#8220;faq&amp;amp;#8221; that have &amp;amp;#8220;updated_at&amp;amp;#8221; set&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; items.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;%&lt;/span&gt;r&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;lt;^&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;archives&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;|&lt;/span&gt;net&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;usenet&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&lt;/span&gt;faqs&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;/&amp;gt;&lt;/span&gt; =~ item.&lt;span style=&quot;color:#9900CC;&quot;&gt;identifier&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;amp;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;amp; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;file&amp;amp;#8217;, &amp;amp;#8216;faq&amp;amp;#8217; ].include?(item[:kind]) &amp;amp;amp;&amp;amp;amp;&amp;amp;#160;!item[:updated_at].nil? }.each do |item|&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# prefer the &amp;amp;#8220;text&amp;amp;#8221; representation, if available (for FAQs)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;unless&lt;/span&gt; item.&lt;span style=&quot;color:#9900CC;&quot;&gt;reps&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#0000FF; font-weight:bold;&quot;&gt;nil&lt;/span&gt;?&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; path = item.&lt;span style=&quot;color:#9900CC;&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;rep: &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; path = item.&lt;span style=&quot;color:#9900CC;&quot;&gt;path&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# use the output files, not the source&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; path = &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@config&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:output_dir&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;+&lt;/span&gt; path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# change the mtime to &amp;amp;#8220;updated_at&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# &amp;amp;#8220;updated_at&amp;amp;#8221; is part Date (when set to 2017-10-01), part String (when set to &amp;amp;#8216;2017-10-01&amp;amp;#8217;),&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# so it has to be converted to strings and parsed (instead of using .to_time)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;FileUtils&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;touch&lt;/span&gt; path, &lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:mtime&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;Time&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:updated_at&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;to_s&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Gut, die Zeitstempel sind jetzt immer noch auffällig, weil ich natürlich nur das Datum der letzten Änderung mitführe, nicht die Uhrzeit, und die Dateien daher scheinbar alle um Mitternacht erzeugt werden, aber damit lässt sich leben. Einziger Nachteil: Die unerwartet &amp;#8220;alten&amp;#8221; Dateien im Downloadbereich bringen das Dependency-Tracking von &lt;em&gt;Nanoc&lt;/em&gt; durcheinander und werden daher bei jedem Durchlauf neu erzeugt, weil die Ausgabedateien (mit einem Zeitstempel von vor einigen Monaten oder Jahren) scheinbar älter sind als die Quelldateien (die frisch aus der Versionskontrolle ausgecheckt wurden und daher einen aktuellen Zeitstempel haben), aber damit lässt sich leben.&lt;/p&gt;

&lt;h3 id=&quot;symlinks-erzeugen&quot;&gt;Symlinks erzeugen&lt;/h3&gt;

&lt;p&gt;Außerdem konnte ich so ein weiteres Problem lösen:&lt;/p&gt;

&lt;p&gt;Die Downloads meiner Scripts (und anderer Software) tragen die Versionsnummer im Dateinamen, bspw. &lt;code&gt;checkmail-0-6-1.tar.gz&lt;/code&gt; für die Version 0.6.1 von &lt;code&gt;checkmail&lt;/code&gt;. Ich möchte aber zugleich immer die aktuellste Version unter dem generischen Namen &lt;code&gt;checkmail.tar.gz&lt;/code&gt; anbieten. Nichts einfacher als das: &lt;code&gt;checkmail.tar.gz&lt;/code&gt; muss ein Symlink auf den jeweils neuesten &amp;#8220;versionierten&amp;#8221; Dateinamen sein. Das lässt sich so auch in das &lt;em&gt;gir&lt;/em&gt;-Repository einchecken &amp;#8230; nur bearbeite ich meine Webseiten unter Windows - und da ist das Konzept von &lt;em&gt;symbolic links&lt;/em&gt; eher nicht so bekannt. Dieses Problem hatte ich vorübergehend &amp;#8220;gelöst&amp;#8221;, indem ich einfach zwei identische Dateien gespeichert habe - aber das ist natürlich ein nerviger Hack, der doppelt Platz braucht und einfach nicht elegant ist.&lt;/p&gt;

&lt;p&gt;Nachdem ich jetzt ohnehin die Dateien im Downloadbereich nach ihrer Generierung nachbehandle, lassen sich dabei auch direkt die &lt;em&gt;Symlinks&lt;/em&gt; erzeugen - zwar immer noch aus einer Platzhalterdatei, aber dafür genügt dann eine leere Datei, die nur den passenden Namen trägt. Mein Ansatz dafür ist folgender (eingefügt in den oben bereits gezeigten Block):&lt;/p&gt;

&lt;p&gt;&lt;div class=&quot;ruby geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;postprocess &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8230;]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# use the output files, not the source&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; path = &lt;span style=&quot;color:#0066ff; font-weight:bold;&quot;&gt;@config&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:output_dir&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;+&lt;/span&gt; path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# generate symlinks&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;if&lt;/span&gt; item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:kind&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;file&amp;amp;#8217; &amp;amp;amp;&amp;amp;amp; item[:current]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# remove placeholder and symlink generic name (&amp;amp;#8216;myprog.tar.gz&amp;amp;#8217;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# to current file (&amp;amp;#8216;myprog-1-2-17.tar.gz&amp;amp;#8217;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;FileUtils&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;rm&lt;/span&gt; path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;FileUtils&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;ln_s&lt;/span&gt; item&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#ff3333; font-weight:bold;&quot;&gt;:current&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#93;&lt;/span&gt;, path&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# mtime shall be changed for the current file&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; path = &lt;span style=&quot;color:#CC00FF; font-weight:bold;&quot;&gt;File&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;dirname&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;path&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8216;/&amp;amp;#8217; + item[:current]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;# change the mtime to &amp;amp;#8220;updated_at&amp;amp;#8221;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#8230;]&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Insgesamt fühlt sich das immer noch wie ein Hack an, aber immerhin nicht mehr ganz so krude. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/6b60e9cfe777446d9c4d57b097010356&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 15 Jan 2018 06:15:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2052-guid.html</guid>
    <category>git</category>
<category>nanoc</category>
<category>ruby</category>

</item>
<item>
    <title>git-commit-notifier</title>
    <link>https://netz-rettung-recht.de/archives/2015-git-commit-notifier.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2015-git-commit-notifier.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2015</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2015</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Es gibt zwar nicht sehr viele &amp;#8220;eigene&amp;#8221; &lt;em&gt;git&lt;/em&gt;-Repositories, an denen außer mir noch andere mitentwickeln, aber einige doch schon, zumindest potentiell; und ungeachtet dessen bereitet es mir auch als bloße Spielerei Freude, wenn ich zumindest die Möglichkeit anbieten kann, per Mail über neue Commits zu informieren.&lt;/p&gt;

&lt;p&gt;Bisher habe ich das mit dem &amp;#8220;eingebauten&amp;#8221; - quasi im Lieferumfang befindlichen - Script &lt;code&gt;post-receive-email&lt;/code&gt; gelöst, das allerdings optisch altbacken daherkommt und v.a. kein Diff mitliefert. Oft habe ich nach Alternativen geschaut und bin dabei immer wieder über &lt;a href=&quot;http://git-commit-notifier.github.io/&quot; title=&quot;Git Commit Notifier by git-commit-notifier&quot;&gt;&lt;code&gt;git-commit-notifier&lt;/code&gt;&lt;/a&gt; gestolpert, das aber irgendwie[tm] bei mir nicht recht laufen wollte.
Der - schon mehrmals erwähnte - &lt;a href=&quot;https://netz-rettung-recht.de/archives/2014-Webseiten-Umzug.html&quot; title=&quot;&quot;&gt;Serverumzug&lt;/a&gt;, den auch meine öffentlichen &lt;em&gt;git&lt;/em&gt;-Repositories mitgemacht haben, bot nun die Gelegenheit für einen neuen Anlauf - und was soll ich sagen? Es funktioniert!&lt;/p&gt;

&lt;p&gt;Wenn &lt;em&gt;Ruby&lt;/em&gt; vorhanden ist (&lt;code&gt;apt install ruby rubygems&lt;/code&gt;), genügt ein &lt;code&gt;gem install git-commit-notifier&lt;/code&gt;, und dann bedarf es nur noch eines Hooks (&lt;code&gt;post-receive&lt;/code&gt; im &lt;code&gt;hooks&lt;/code&gt;-Verzeichnis, ausführbar!) mit dem folgenden Inhalt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
git-commit-notifier /path/to/git-notifier-config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230; und einer Konfiguration in &lt;code&gt;/path/to/git-notifier-config.yaml&lt;/code&gt; nach dem vorhandenen &lt;a href=&quot;https://raw.githubusercontent.com/git-commit-notifier/git-commit-notifier/master/config/git-notifier-config.example.yml&quot; title=&quot;&quot;&gt;Muster&lt;/a&gt;, und schon gibt es schön bunte Benachrichtigungen, deren Adressaten und Inhalt sehr weitgehend konfigurierbar sind.&lt;/p&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 1691px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:466 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;1691&quot; height=&quot;748&quot;  src=&quot;https://netz-rettung-recht.de/uploads/articles/2017/git-commit-notifier-example.png&quot;  alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Screenshot einer durch &lt;i&gt;git commit notifier&lt;/i&gt; generierten Benachrichtigung.&lt;/div&gt;&lt;/div&gt;
 
    </content:encoded>

    <pubDate>Fri, 18 Aug 2017 06:05:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2015-guid.html</guid>
    <category>git</category>
<category>ruby</category>

</item>
<item>
    <title>Git Aliases</title>
    <link>https://netz-rettung-recht.de/archives/1995-Git-Aliases.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1995-Git-Aliases.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1995</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1995</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;em&gt;Git&lt;/em&gt; nutze ich jetzt &lt;a href=&quot;https://netz-rettung-recht.de/archives/1485-git.html&quot; title=&quot;&quot;&gt;mehr als sieben Jahre&lt;/a&gt;, kratze aber oft immer noch nur an der Oberfläche. Insbesondere habe ich lange Zeit die sehr nützlichen Aliase für &lt;em&gt;Git&lt;/em&gt;-Kommandos nicht genutzt, die die Tipparbeit sehr vereinfachen können.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pro Git&lt;/em&gt; sagt im Kapitel 2.7 &amp;#8220;&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases&quot; title=&quot;Git - Git Aliases&quot;&gt;Git Aliases&lt;/a&gt;&amp;#8221; eigentlich alles dazu, was man wissen mus: &lt;code&gt;git config alias.NAME COMMAND&lt;/code&gt; macht &lt;code&gt;git NAME&lt;/code&gt; zu einem Alias für &lt;code&gt;git COMMAND&lt;/code&gt;. Ist &lt;code&gt;COMMAND&lt;/code&gt; kein &lt;em&gt;Git&lt;/em&gt;-Kommando, ist ihm ein &lt;code&gt;!&lt;/code&gt; voranzustellen. &lt;code&gt;git config --global&lt;/code&gt; statt &lt;code&gt;git config&lt;/code&gt; macht den Alias für alle Repositories des Benutzers verfügbar, &lt;code&gt;git config --system&lt;/code&gt; tut das systemweit.&lt;/p&gt;

&lt;p&gt;Zwei Beispiele will ich noch geben:&lt;/p&gt;

&lt;h3 id=&quot;-git-publish-f-r-webseiten&quot;&gt;&lt;code&gt;git publish&lt;/code&gt; für Webseiten&lt;/h3&gt;

&lt;p&gt;In meinem &amp;#8220;&lt;a href=&quot;https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html&quot; title=&quot;&quot;&gt;Webseiten-Workflow&lt;/a&gt;&amp;#8221; ist es regelmäßig erforderlich, Änderungen aus dem &lt;em&gt;test&lt;/em&gt;-Zweig eines Repositorys in den &lt;em&gt;master&lt;/em&gt;-Zweig zu übernehmen und diesen dann zu &lt;em&gt;pushen&lt;/em&gt;. Dafür kann man jedes Mal &lt;code&gt;git checkout master; git merge test; git push; git checkout test&lt;/code&gt; tippen, und so habe ich das auch lange Zeit gemacht. Man kann aber auch einen Alias &lt;code&gt;publish&lt;/code&gt; definieren und dann schlicht (und gut merkbar) &lt;code&gt;git publish&lt;/code&gt; verwenden, um die Änderungen aus dem &lt;em&gt;test&lt;/em&gt;-Zweig zu &amp;#8220;veröffentlichen&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Der Alias lässt sich anlegen durch &lt;code&gt;git config alias.publish &#039;!git checkout master; git merge test; git push; git checkout test&#039;&lt;/code&gt; oder durch Einfügen des folgenden Abschnitts in die &lt;code&gt;config&lt;/code&gt;-Datei im &lt;code&gt;.git&lt;/code&gt;-Verzeichnis des Repositorys:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[alias]
  publish = &quot;!git checkout master; git merge test; git push; git checkout test\n&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;-git-refresh-zur-bernahme-von-upstream-nderungen&quot;&gt;&lt;code&gt;git refresh&lt;/code&gt; zur Übernahme von Upstream-Änderungen&lt;/h3&gt;

&lt;p&gt;Wer in einem &lt;em&gt;Github&lt;/em&gt;-Projekt mitarbeitet, wird regelmäßig das entsprechende Repository forken und dann Änderungen als &lt;em&gt;Pull Requests&lt;/em&gt; zur Überprüfung stellen. Ich habe dann in meinem lokalen Repository jeweils zwei &lt;em&gt;Remotes&lt;/em&gt; konfiguriert: &lt;em&gt;origin&lt;/em&gt; ist mein eigenes &lt;em&gt;Github&lt;/em&gt;-Repository, der Fork, und &lt;em&gt;upstream&lt;/em&gt; das Repository des Projekts. Außerdem habe ich in meinem Repository einen &lt;em&gt;upstream&lt;/em&gt;-Branch, der dem &lt;em&gt;master&lt;/em&gt;-Branch des Projekt-Repositorys folgt.&lt;/p&gt;

&lt;p&gt;Will ich Änderungen aus dem Projekt-Repository in meinen &lt;em&gt;master&lt;/em&gt;-Zweig übernehmen, gehören dazu folgende Schritte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;den &lt;em&gt;upstream&lt;/em&gt;-Zweig mit dem &lt;em&gt;master&lt;/em&gt;-Zweig des Projekt-Repositorys zu aktualisieren&lt;/li&gt;
&lt;li&gt;den &lt;em&gt;upstream&lt;/em&gt;-Zweig in meinem geforkten Repository veröffentlichen&lt;/li&gt;
&lt;li&gt;den &lt;em&gt;upstream&lt;/em&gt;-Zweig in meinen &lt;em&gt;master&lt;/em&gt;-Zweig mergen&lt;/li&gt;
&lt;li&gt;meinen &lt;em&gt;master&lt;/em&gt;-Zweig veröffentlichen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das erfordert also folgende Kommandos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout upstream
git pull
git push origin
git checkout master
git merge upstream
git push origin
git remote prune origin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Das letzte Kommando entfernt lokale Tracking-Branches, die in meinem Github-Repository schon nicht mehr existieren.)&lt;/p&gt;

&lt;p&gt;Ein Alias dafür ist echt praktisch:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git config alias.refresh &#039;!git checkout upstream; git pull; git push origin; git checkout master; git merge upstream; git push origin; git remote prune origin&#039;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;git refresh&lt;/code&gt; führt dann alle dargestellten Kommandos nacheinander aus.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/00dfdcc105c24ccb8ef201f8de75b994&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 19 May 2017 04:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1995-guid.html</guid>
    <category>git</category>

</item>
<item>
    <title>Workflow für die Erstellung und Pflege von Webseiten</title>
    <link>https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1994-Workflow-fuer-die-Erstellung-und-Pflege-von-Webseiten.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1994</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1994</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Ich stelle die von mir betriebenen Webseiten, die nicht auf interaktive Funktionen angewiesen sind, Stück für Stück auf statisch generierte Seiten um, zuletzt meine &lt;a href=&quot;https://netz-rettung-recht.de/archives/1987-Relaunch-von-th-h.de.html&quot; title=&quot;&quot;&gt;Homepage&lt;/a&gt;. Dabei setze ich auf einen Workflow, der &lt;em&gt;nanoc&lt;/em&gt; als &lt;em&gt;static site generator&lt;/em&gt; und &lt;em&gt;git&lt;/em&gt; als Versionsverwaltungssystem umfasst und dafür sorgt, dass Änderungen der Seiten automatisch eingespielt werden.&lt;/p&gt;

&lt;h3 id=&quot;entwicklung-test-und-ver-ffentlichung&quot;&gt;Entwicklung, Test und Veröffentlichung&lt;/h3&gt;

&lt;p&gt;Bei Verwendung eines &lt;em&gt;static site generators&lt;/em&gt; werden die Webseiten zunächst aus Quelldateien erzeugt und müssen dann veröffentlicht, d.h. in das passende Verzeichnis des Webservers befördert werden, der sie anzeigen soll. Darüber hinaus ist es generell sinnvoll, &amp;#8220;Code&amp;#8221; im weitesten Sinne - und dazu gehören dann auch HTML- und CSS-Dateien bzw. die Quellen, aus denen diese erzeugt werden - in einem Versionsverwaltungssystem zu speichern, in dem Änderungen nachverfolgbar sind und wo jederzeit auf ältere Versionen zurückgegriffen werden kann. Nimmt man dies zusammen, unterscheiden sich Webseiten damit letztlich kaum mehr von Webapplikationen oder anderer Software: es gibt den Quellcode und das Kompilat (die fertigen Seiten, das ablauffähige Programm), Quellcode muss verwaltet und das Ergebnis getestet und schließlich veröffentlicht (deployed) werden.&lt;/p&gt;

&lt;p&gt;Für die drei Schritte - entwickeln, testen, veröffentlichen - werden zumeist mehrere Rechner (Systeme, Umgebungen) benötigt, die unterschiedlichen Zwecken dienen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Entwicklungsumgebung&lt;br /&gt;
Der Rechner, auf dem die Seiten entworfen, bearbeitet und ggf. auch getestet werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Git&lt;/em&gt;-Server&lt;br /&gt;
&lt;em&gt;Git&lt;/em&gt; ist zwar ein verteiltes Versionsverwaltungssystem, aber es ist generell sinnvoll, das Repository nicht nur auf dem eigenen Arbeitsrechner vorzuhalten, sondern auch auf (mindestens) einem Server. Das schafft Redundanz und ermöglicht es, auf verschiedenen Rechner zu arbeiten und die Ergebnisse jeweils zu synchronisieren.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testumgebung&lt;br /&gt;
Es ist sinnvoll, ein Testsystem vorzuhalten, dass dem Echtsystem weitgehend entspricht, um testen zu können, ob die Webseiten auch wirklich so aussehen und &amp;#8220;funktionieren&amp;#8221;, wie man sich das vorstellt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Echtumgebung&lt;br /&gt;
Am Ende des Tages sollen die Webseiten auf einem Rechner im Netz liegen, der sie mithilfe eines Webservers weltweit abrufbar macht.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grundsätzlich kann man das alles auf ein- und demselben Gerät betreiben: eine im Netz verfügbare Maschine, auf der man sich einloggt und entwickelt, auf der &lt;em&gt;Git&lt;/em&gt; verfügbar ist und die zugleich Test- und Echtumgebung darstellt. Meistens wird man aber doch auf dem heimischen Desktoprechner oder dem Laptop arbeiten wollen und einen Webserver (oder auch nur Webspace) irgendwo angemietet haben. Letzteres gilt auch für mich.&lt;/p&gt;

&lt;h3 id=&quot;mein-workflow&quot;&gt;Mein Workflow&lt;/h3&gt;

&lt;p&gt;Ich &lt;strong&gt;bearbeite&lt;/strong&gt; die Quelldateien (den Sourcecode) meiner Webseiten auf meinem Desktoprechner oder dem Laptop unter Windows, zumeist mit &lt;a href=&quot;http://www.sublimetext.com/&quot; title=&quot;Sublime Text - Text Editing, Done Right&quot;&gt;&lt;em&gt;Sublime Text&lt;/em&gt;&lt;/a&gt;, reine Markdown-Dateien manchmal auch mit &lt;a href=&quot;http://markdownpad.com/&quot; title=&quot;MarkdownPad - The Markdown Editor for Windows&quot;&gt;&lt;em&gt;MarkdownPad&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;nanoc&lt;/em&gt; unterstützt einen sehr bequemen &lt;strong&gt;Test&lt;/strong&gt;modus mit eingebautem Webserver: nach dem Compilieren mit &lt;code&gt;nanoc&lt;/code&gt; genügt ein &lt;code&gt;nanoc view&lt;/code&gt;, um einen Webserver zu starten, der dann unter &lt;code&gt;http://localhost:3000/&lt;/code&gt; die Website zur Ansicht bereitstellt. Leider funktioniert das für mich noch nicht, denn zwar lässt sich &lt;em&gt;nanoc&lt;/em&gt; grundsätzlich auch &lt;a href=&quot;https://netz-rettung-recht.de/archives/1824-Installation-von-nanoc-unter-Windwows-7.html&quot; title=&quot;&quot;&gt;unter Windows installieren&lt;/a&gt; und betreiben, aber das für den &lt;em&gt;LESS&lt;/em&gt;-Filter erforderliche Ruby-Gem leider nicht - jedenfalls ist mir das nicht gelungen. Daher arbeite ich weiterhin &amp;#8220;nach alter Väter Sitte&amp;#8221; und lade die geänderten Dateien per &lt;em&gt;SCP&lt;/em&gt; bzw. &lt;em&gt;SFTP&lt;/em&gt; entweder auf einen lokalen Linux-Server oder direkt auf den externen Webserver hoch bzw. sorge für eine &lt;a href=&quot;https://netz-rettung-recht.de/archives/1841-WinSCP-und-die-automatische-Synchronisierung.html&quot; title=&quot;&quot;&gt;automatische Synchronisierung mit &lt;em&gt;WinSCP&lt;/em&gt;&lt;/a&gt;. Dort wird dann compiliert und im Browser das Ergebnis angeschaut.&lt;/p&gt;

&lt;p&gt;Auch das &lt;strong&gt;Veröffentlichen&lt;/strong&gt; der Seiten unterstützt &lt;em&gt;nanoc&lt;/em&gt; mit dem Kommando &lt;code&gt;nanoc deploy&lt;/code&gt;, das ein Deployment per &lt;em&gt;git&lt;/em&gt;, per &lt;em&gt;rsync&lt;/em&gt; oder mittels &lt;a href=&quot;http://fog.io/&quot; title=&quot;302 Found&quot;&gt;&lt;em&gt;fog&lt;/em&gt;&lt;/a&gt; unterstützt. Das ist sicherlich sehr nützlich, wenn man die Webseiten auf dem Entwicklungsrechner testet und dann von dort auf den Webserver überspielt; nachdem &lt;em&gt;nanoc&lt;/em&gt; aber auf meinen Windows-Rechnern nicht läuft, gehe ich einen anderen Weg und compiliere direkt auf dem Webserver. Ich lade also den Quellcode hoch, lasse &lt;em&gt;nanoc&lt;/em&gt; auf dem Server laufen und das Ergebnis dann unmittelbar in das Webserver-Verzeichnis ausgeben (in der Regel durch ein passend gesetztes &lt;code&gt;output_dir&lt;/code&gt; in der &lt;code&gt;nanoc.yaml&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Ich halte regelmäßig neben der aktuellen Fassung meiner Webseiten auch eine Testfassung vor, die ich über eine passwortgeschützte URL aufrufen kann. Das hat den Vorteil, dass ich von überallher testen kann und zudem die Testumgebung und die Echtumgebung identisch sind, weil sie auf demselben Server (in zwei unterschiedlichen &lt;em&gt;virtual hosts&lt;/em&gt;) laufen.&lt;/p&gt;

&lt;p&gt;Das jeweilige &lt;strong&gt;&lt;em&gt;Git&lt;/em&gt;-Repository&lt;/strong&gt; für eine Website hat daher immer mindestens den &lt;em&gt;master&lt;/em&gt;- und einen &lt;em&gt;staging&lt;/em&gt;-Zweig; im letzteren wird getestet, der erstere enthält die aktuelle Echtversion. Wenn ich einen dieser Zweige per &lt;code&gt;git push&lt;/code&gt; auf meinen &lt;em&gt;Git&lt;/em&gt;-Server schiebe, wird er automatisch auf den Webserver kopiert (in das Quellverzeichnis für die Echtfassung oder dasjenige für die Testversion der Website), dort compiliert und bereitgestellt. Auch für dieses &amp;#8220;Kopieren&amp;#8221; oder generell das Aktualisieren einer Website über &lt;em&gt;git&lt;/em&gt; gibt es eine Reihe von Möglichkeiten: man kann bspw. einfach das &lt;em&gt;Git&lt;/em&gt;-Repository auf dem Webserver auschecken, oder aber man checkt via &lt;code&gt;git archive&lt;/code&gt; wirklich nur den Inhalt des Repositorys aus. Ich habe mich für letzteres entschieden; einziger Nachteil ist, das aus dem Repository entfernte Dateien nicht automatisch gelöscht werden, ggf. also &amp;#8220;Leichen&amp;#8221; verbleiben. Dafür habe ich nicht das komplette Repository mit der ganzen History herumliegen.&lt;/p&gt;

&lt;h3 id=&quot;ein-beispiel&quot;&gt;Ein Beispiel&lt;/h3&gt;

&lt;p&gt;In der Praxis sieht das dann ungefähr so aus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ich aktualisiere mein lokales &lt;em&gt;Git&lt;/em&gt;-Repository auf dem jeweiligen Arbeitsrechner, damit es auf dem aktuellen Stand ist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ich verändere oder ergänze meine Webseiten, indem ich die entsprechenden Dateien auf dem Arbeitsrechner bearbeite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wenn umfangreichere Tests erforderlich sind, lade ich die geänderten Dateien auf meinen Webserver in das Quellverzeichnis für die Test-Instanz der jeweiligen Website hoch und führe - auf dem Server - &lt;em&gt;nanoc&lt;/em&gt; aus, so dass die Testinstanz der jeweiligen Webseiten aktualisiert wird. Im Browser kann ich dann die geänderten Seiten durch Aufruf von &lt;code&gt;http://test.meine-website.example/&lt;/code&gt; ansehen. Alternativ kann ich natürlich auch auf einem anderen Rechner im lokalen Netz testen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wenn ich mit dem Ergebnis zufrieden bin, aktualisiere ich den &lt;em&gt;test&lt;/em&gt;-Zweig meines lokalen &lt;em&gt;Git&lt;/em&gt;-Repositorys und schiebe ihn per &lt;code&gt;git push&lt;/code&gt; auf den externen &lt;em&gt;Git&lt;/em&gt;-Server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dort wird ein &lt;code&gt;post-receive&lt;/code&gt;-Hook ausgeführt, der auf dem richtigen Webserver ein PHP-Script mit den passenden Paramtern aufruft. Das Script sorgt dann dafür, dass die Dateien aus dem &lt;em&gt;Git&lt;/em&gt;-Repository ausgecheckt werden, und führt danach &lt;em&gt;nanoc&lt;/em&gt; aus. Für den &lt;code&gt;test&lt;/code&gt;-Zweig des Repositories &lt;code&gt;websites/meine-website&lt;/code&gt; auf dem Server &lt;code&gt;git.server.example&lt;/code&gt; mit dem Zielverzeichnis &lt;code&gt;/var/www/sources/meine-website/&lt;/code&gt; auf dem Webserver sähe das dann so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git archive --format=tar --remote=ssh://git@git.server.example/websites/meine-website test | tar -C /var/www/sources/test.meine-website.example/ -xf -
$ cd /var/www/sources/test.meine-website.example/
$ nanoc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;nanoc&lt;/em&gt; hat dann als &lt;code&gt;output_dir&lt;/code&gt; bspw. &lt;code&gt;/var/www/html/test.meine-website.example/&lt;/code&gt; konfiguriert, was zugleich das &lt;code&gt;DocumentRoot&lt;/code&gt; für den &lt;em&gt;virtual host&lt;/em&gt; &lt;code&gt;http://test.meine-website.example/&lt;/code&gt; ist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will ich später die gesammelten Änderungen aus der Testinstanz auf die Echtinstanz übernehmen, geht das ebenfalls ganz einfach: ich bringe sie in den &lt;em&gt;master&lt;/em&gt;-zweig meines Repositorys und veröffentliche diesen: &lt;code&gt;git checkout master; git merge test; git push; git checkout test&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der &lt;code&gt;post-receive&lt;/code&gt;-Hook wird das Deployment-Script mit anderen Parametern aufrufen, so dass nicht der &lt;em&gt;test&lt;/em&gt;-Zweig, sondern der &lt;em&gt;master&lt;/em&gt;-Zweig ausgecheckt und nicht nach &lt;code&gt;/var/www/sources/test.meine-website.example/&lt;/code&gt;, sondern nach &lt;code&gt;/var/www/sources/www.meine-website.example/&lt;/code&gt; kopiert wird. Und das ist dementsprechend das &lt;code&gt;DocumentRoot&lt;/code&gt; für  &lt;code&gt;http://www.meine-website.example/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Die &lt;em&gt;nanoc&lt;/em&gt;-Ausgaben gibt das Deployment-Script aus, so dass der &lt;em&gt;Git&lt;/em&gt;-Server sie an den &lt;em&gt;Git&lt;/em&gt;-Client übermittelt; sollte &lt;em&gt;nanoc&lt;/em&gt; die Compilation also mit einer Fehlermeldung abbrechen, ist das erkennbar und ermöglicht ein manuelles Eingreifen. Ansonsten sind manuelle Eingriffe nur noch erforderlich, wenn eine bereits deployte Datei gelöscht werden muss; es liegt in der Natur der Sache, dass der gewählte Weg über &lt;code&gt;git archive&lt;/code&gt; neue und geänderte Dateien (und Verzeichnisse) anlegt, alte Dateien aber nicht löscht.&lt;/p&gt;

&lt;h3 id=&quot;conclusio&quot;&gt;Conclusio&lt;/h3&gt;

&lt;p&gt;Viele Wege führen nach Rom; dies ist meiner.&lt;/p&gt;

&lt;p&gt;Er lässt sich fraglos vereinfachen; ein Hemmschuh ist insbesondere die Entwicklung unter Windows, die den Workflow erschwert.&lt;/p&gt;

&lt;p&gt;Kommentare und Kritik nehme ich gerne entgegen, ebenso wie andere Wege zum selben Ziel. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/ad21ecfbf841470584fc58c8c5a75c2f&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 17 May 2017 05:20:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1994-guid.html</guid>
    <category>git</category>
<category>nanoc</category>
<category>webdesign</category>

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

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1650</wfw:commentRss>
    

    <author>nospam@example.com (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;quot;ja&amp;quot;, aber teilweise muß man schon etwas googeln, um diese Antwort zu finden. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&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 &amp;#8230; &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;pre&gt;&lt;code&gt;Host git.example.org
Port 2022
IdentityFile ~/.ssh/gitkey
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;SSH-Zugriffe auf den Server &amp;quot;git.example.org&amp;quot;&amp;#160; erfolgen also auf Port 2022 (statt 22) und unter Verwendung des Schlüssels &amp;quot;gitkey&amp;quot;. 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;quot;git.example.org&amp;quot; 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;https://git.wiki.kernel.org/index.php/GitTips#How_to_pass_ssh_options_in_git.3F&quot; title=&quot;301 Moved Permanently&quot;&gt;empfiehlt&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Host private.example.com
    User myname
    Hostname git.example.com
    IdentityFile ~/.ssh/private-identity
Host public.example.com
    User groupname
    Hostname git.example.com
    IdentityFile ~/.ssh/public-identity
&lt;/code&gt;&lt;/pre&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 &amp;#8230;) 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://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/&quot; title=&quot;301 Moved Permanently&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;quot;README&amp;quot; aus dem Branch &amp;quot;test&amp;quot; in meinen Branch &amp;quot;master&amp;quot; übernehmen, aber eben nur diese Datei in genau dem Zustand, den sie im &amp;quot;test&amp;quot;-Branch hat. Das geht dann folgendermaßen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout master
git checkout test README
git commit -m &#039;Imported README from test branch&#039;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Genauso funktioniert das natürlich mit mehreren Dateien:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout test README doc/explanation.txt doc/TODO
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voilà. Soviel für heute. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt; &lt;br /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/b0f5095597b5454285c7cf88fcaebdaf&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 12 Jan 2011 16:30:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/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>https://netz-rettung-recht.de/archives/1590-Mantis-Git-Integration-ein-steiniger-Weg.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1590-Mantis-Git-Integration-ein-steiniger-Weg.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1590</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1590</wfw:commentRss>
    

    <author>nospam@example.com (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://leetcode.net/&quot; title=&quot;301 Moved Permanently&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;https://netz-rettung-recht.de/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://leetcode.net/blog/2009/01/integrating-git-svn-with-mantisbt/&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://leetcode.net/blog/2009/03/integrating-source-control-with-mantisbt/&quot;&gt;März&lt;/a&gt; und &lt;a title=&quot;Leetcode: Detailed Integration of Subversion in MantisBT&quot; href=&quot;http://leetcode.net/blog/2009/10/detailed-integration-of-subversion-in-mantisbt/&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://git.mantisforge.org/w/meta.git&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://git.mantisforge.org/w/source-integration.git&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;https://github.com/mantisbt-plugins/source-integration&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 (&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;? ).&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://leetcode.net/mantis/view.php?id=85#c211&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 &amp;#8230;&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;&amp;#8230; 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;code&gt;curl &#039;http://host.domain.example/mantis/plugin.php?page=Source/import&amp;amp;id=XX&#039; &amp;gt; /dev/null&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;/code&gt; &lt;/p&gt;&lt;/p&gt;

&lt;p&gt;Über weitere Erfahrungsberichte zu diesem Thema würde ich mich übrigens freuen. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/372027f5ecf44224ba8b8a51a6cc2a42&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Sat, 15 May 2010 08:46:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/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>https://netz-rettung-recht.de/archives/1566-msysgit-mit-PLink,-Pageant-und-SSH.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1566-msysgit-mit-PLink,-Pageant-und-SSH.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1566</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1566</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;strong&gt;Dieser Text ist überholt und nicht mehr aktuell.&lt;/strong&gt; Eine aktuelle &lt;a href=&quot;https://th-h.de/net/misc/git/installation/&quot; title=&quot;Installation von git for Windows | th-h.de&quot;&gt;Anleitung&lt;/a&gt; für die Installation von &lt;em&gt;git for Windows&lt;/em&gt;, dem Nachfolger von &lt;em&gt;msysgit&lt;/em&gt;, zusammen mit &lt;em&gt;plink&lt;/em&gt; aus dem &lt;em&gt;Putty&lt;/em&gt;-Paket findet sich auf meinen Webseiten.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;serendipity_imageComment_right&quot; style=&quot;width: 175px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb: --&gt;&lt;img class=&quot;serendipity_image_right&quot; width=&quot;175&quot; height=&quot;200&quot;  src=&quot;https://netz-rettung-recht.de/uploads/2010-04-12-erweitert.serendipityThumb.jpg&quot;  alt=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Systemeigenschaften -&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;https://netz-rettung-recht.de/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://www.bitsandpix.com/entry/git-setup-msysgit-install-with-pageantplink-from-putty/&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: 178px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb: --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;178&quot; height=&quot;200&quot;  src=&quot;https://netz-rettung-recht.de/uploads/2010-04-12-environment.serendipityThumb.jpg&quot;  alt=&quot;&quot;&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;quot;&lt;em&gt;Systemeigenschaften&lt;/em&gt;&amp;quot; (Rechtsklick auf &amp;quot;&lt;em&gt;Arbeitsplatz&lt;/em&gt;&amp;quot; oder &amp;quot;My &lt;em&gt;Computer&lt;/em&gt;&amp;quot; und dann &amp;quot;&lt;em&gt;Eigenschaften&lt;/em&gt;&amp;quot;) auf der Registerkarte &amp;quot;&lt;em&gt;Erweitert&lt;/em&gt;&amp;quot; unter dem Button &amp;quot;&lt;em&gt;Umgebungsvariablen&lt;/em&gt;&amp;quot; unter &amp;quot;&lt;em&gt;Systemvariablen&lt;/em&gt;&amp;quot;. Ein beherzter Klick auf &amp;quot;Neu&amp;quot; fördert ein Eingabefeld zutage, in dem man nunmehr &amp;quot;&lt;em&gt;GIT_SSH&lt;/em&gt;&amp;quot; und den kompletten Pfad zur Datei &amp;quot;&lt;em&gt;PLink.exe&lt;/em&gt;&amp;quot; - bspw. &amp;quot;&lt;em&gt;C:\Programme\PuTTY\plink.exe&lt;/em&gt;&amp;quot; - 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 21:02:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/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>https://netz-rettung-recht.de/archives/1560-Sprachauswahl-bei-Git-on-Windows-msysgit.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1560-Sprachauswahl-bei-Git-on-Windows-msysgit.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1560</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1560</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;strong&gt;Dieser Text ist überholt und nicht mehr aktuell.&lt;/strong&gt; Eine aktuelle &lt;a href=&quot;https://th-h.de/net/misc/git/installation/&quot; title=&quot;Installation von git for Windows | th-h.de&quot;&gt;Anleitung&lt;/a&gt; für die Installation von &lt;em&gt;git for Windows&lt;/em&gt;, dem Nachfolger von &lt;em&gt;msysgit&lt;/em&gt;, zusammen mit &lt;em&gt;plink&lt;/em&gt; aus dem &lt;em&gt;Putty&lt;/em&gt;-Paket findet sich auf meinen Webseiten.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Wie ich bereits im Februar &lt;a title=&quot;Git unter Windows&quot; href=&quot;https://netz-rettung-recht.de/archives/1549-Git-unter-Windows.html&quot;&gt;beschrieben&lt;/a&gt; habe, benutze ich unter Windows msysgit bzw. &amp;quot;Git on Windows&amp;quot;. 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;quot;Zweig&amp;quot; ist ja noch klar, &amp;quot;Zusammenführen&amp;quot; für &amp;quot;Merge&amp;quot; auch, aber das &amp;quot;Version&amp;quot; für &amp;quot;Commit&amp;quot; steht erschließt sich nicht sofort. Und Menüpunkte unterhalb von &amp;quot;Zweig&amp;quot; wie &amp;quot;Erstellen&amp;quot;, &amp;quot;Umstellen&amp;quot; oder &amp;quot;Zurücksetzen&amp;quot; sind auch alles andere als klar - &amp;quot;Erstellen&amp;quot; ist ohne Frage &amp;quot;Create&amp;quot;, aber &amp;quot;Umstellen&amp;quot;? Gut, man kann vielleicht noch darauf kommen, daß das für &amp;quot;Checkout / Switch&amp;quot; steht &amp;#8230; aber bedeutet &amp;quot;Zurücksetzen&amp;quot; jetzt &amp;quot;Reset&amp;quot; oder &amp;quot;Rebase&amp;quot;? Usw. usf. &amp;#8230; 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;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&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;quot;&lt;em&gt;de.msg&lt;/em&gt;&amp;quot; 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;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/061bbf1cccc64d209854fc717119d7dc&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 09 Apr 2010 05:21:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1560-guid.html</guid>
    <category>anleitung</category>
<category>git</category>
<category>windows</category>

</item>
<item>
    <title>git archive</title>
    <link>https://netz-rettung-recht.de/archives/1551-git-archive.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1551-git-archive.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1551</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1551</wfw:commentRss>
    

    <author>nospam@example.com (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;quot;--enable=upload-archive&amp;quot;.&lt;/p&gt; 
&lt;p&gt;Dann aber kann mit einem Aufruf wie&lt;/p&gt; 

&lt;pre&gt;&lt;code&gt;git archive --format=tar --remote=git://git.domain.example/$REPO.git --prefix=$PREFIX/ $TAG | gzip &amp;gt; $REPO.tar.gz&lt;/code&gt;&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;&lt;code&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;/code&gt;&lt;/pre&gt;

&lt;p&gt;erzeugt also aus dem Repository myprog.git in der mit &amp;quot;2.17&amp;quot; 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;quot;myprog-2.17/&amp;quot; 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;div class=&quot;bash geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#! /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# do a release of myprog&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# $1: version number&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# make tempdir&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #007800;&quot;&gt;tempdir&lt;/span&gt;=&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;mktemp&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-td&lt;/span&gt; myprog-XXXXX&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;git archive&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;--format&lt;/span&gt;=&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;tar&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;--remote&lt;/span&gt;=git:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;git.domain.example&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;myprog.git &lt;span style=&quot;color: #660033;&quot;&gt;--prefix&lt;/span&gt;=myprog-&lt;span style=&quot;color: #007800;&quot;&gt;$1&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$1&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;|&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$tempdir&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;amp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&lt;/span&gt;amp; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;tar&lt;/span&gt; xf -&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$tempdir&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;myprog-&lt;span style=&quot;color: #007800;&quot;&gt;$1&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;pod2text &lt;span style=&quot;color: #660033;&quot;&gt;-l&lt;/span&gt; myprog.pl README&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; .gitignore&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$tempdir&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;tar&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-czf&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;var&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;www&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;myprog&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;download&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;myprog-&lt;span style=&quot;color: #007800;&quot;&gt;$1&lt;/span&gt;.tar.gz myprog-&lt;span style=&quot;color: #007800;&quot;&gt;$1&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;rm&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-r&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$tempdir&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&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;&lt;code&gt;git archive --format=tar --remote=git://git.domain.example/repository.git master beispiel.txt | tar xf -&lt;/code&gt;&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;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/5991b67f9ec247e6848d4058cced736e&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Sat, 27 Feb 2010 17:52:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1551-guid.html</guid>
    <category>anleitung</category>
<category>git</category>

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

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1550</wfw:commentRss>
    

    <author>nospam@example.com (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;quot;fortgeschrittene&amp;quot; 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;quot;solo&amp;quot; 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;quot;offline&amp;quot; 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;quot;offiziellen&amp;quot; 
Repository - das im Netz steht - beliebig viele &amp;quot;inoffizielle&amp;quot; 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;quot;eigentliche&amp;quot; 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;quot;köcheln&amp;quot; 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;https://netz-rettung-recht.de/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;quot;offiziellen&amp;quot; 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;quot;herumzuspielen&amp;quot; und dabei dem Motto &amp;quot;Commit early, commit often&amp;quot; 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;quot;Mit Vorsicht genutzt&amp;quot; deshalb, weil es natürlich fatal
 ist, die Versionsgeschichte bereits veröffentlichter &lt;em&gt;branches&lt;/em&gt; 
umzuschreiben &amp;#8230; 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;quot;work in progress&amp;quot; sind und keinesfalls für eigene Entwicklungszwecke gepullt werden sollen.&lt;br /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/3c8d6adb677d4285bc34a4014df1b1e2&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Wed, 24 Feb 2010 21:33:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1550-guid.html</guid>
    <category>git</category>

</item>
<item>
    <title>Git unter Windows</title>
    <link>https://netz-rettung-recht.de/archives/1549-Git-unter-Windows.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1549-Git-unter-Windows.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1549</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1549</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;strong&gt;Dieser Text ist überholt und nicht mehr aktuell.&lt;/strong&gt; Ich nutze bereits seit Mitte 2010&amp;#160;&lt;em&gt;TortoiseGit&lt;/em&gt; nicht mehr. Eine &lt;a href=&quot;https://th-h.de/net/misc/git/installation/&quot; title=&quot;Installation von git for Windows | th-h.de&quot;&gt;Anleitung&lt;/a&gt; für die Installation von &lt;em&gt;git for Windows&lt;/em&gt;, dem Nachfolger von &lt;em&gt;msysgit&lt;/em&gt;, zusammen mit &lt;em&gt;plink&lt;/em&gt; aus dem &lt;em&gt;Putty&lt;/em&gt;-Paket findet sich auf meinen Webseiten.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Bereits Anfang Januar hatte ich von &lt;a href=&quot;https://netz-rettung-recht.de/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://code.google.com/p/tortoisegit/&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://tortoisesvn.tigris.org/&quot; title=&quot;TortoiseSVN&quot;&gt;&lt;em&gt;TortoiseSVN&lt;/em&gt;&lt;/a&gt;, und zugleich &lt;a href=&quot;http://code.google.com/p/msysgit/&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 16:21:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1549-guid.html</guid>
    <category>git</category>
<category>windows</category>

</item>
<item>
    <title>INN-Funktionsweise: Steuernachrichten und Filter</title>
    <link>https://netz-rettung-recht.de/archives/1499-INN-Funktionsweise-Steuernachrichten-und-Filter.html</link>
            <category>Releases</category>
    
    <comments>https://netz-rettung-recht.de/archives/1499-INN-Funktionsweise-Steuernachrichten-und-Filter.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1499</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1499</wfw:commentRss>
    

    <author>nospam@example.com (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;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&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;https://netz-rettung-recht.de/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;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/wink.png&quot; alt=&quot;;-)&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 &amp;#8230;).&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/0bbd074b302542debbd380f26dab9edf&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Sun, 17 Jan 2010 16:06:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1499-guid.html</guid>
    <category>git</category>
<category>inn</category>
<category>usenet</category>

</item>

</channel>
</rss>
