Das weiß ich auch noch nicht ... zumal das für mindestens einen der Beteiligten (der die Absprachen - aka "Regeln" - für die Verwaltung des Repo dann aufschreibt) erst einmal in deutlich mehr "Verwaltungsarbeit" ausarten würde, als in die Chance, sich gleich in die Arbeit (der Entwicklung) stürzen zu können.
Die Gefahr, daß man am Ende nicht mehr weiß, was man nehmen soll, sehe ich absolut nicht ... wenn das Projekt-Repo einen "Release-Zweig" hat, in dem es stabile Stände gibt, zu denen dann wieder Fehlerkorrekturen vorhanden sind, dann sind schon mal die Benutzer, die wirklich "stable" wollen, "abgefrühstückt".
Gibt es parallel dazu einen "Developer-Branch", in dem die aktuellen
Pakete Änderungen
zusammengefaßt sind, kommen auch die "Spielkinder" auf ihre Kosten ... die können diesen Stand nehmen und nach Herzenslust auf jedem Gerät testen, welches ihnen in die Finger gerät. Hält man dann nämlich die eigene Policy ein, daß nur tatsächlich getestete Änderungen auch in den Release-Branch gelangen, hat man - fast automatisch - auch weniger mit den oben erwähnten "Fehlerkorrekturen" zu tun in diesem Branch, weil solche Korrekturen dann (zumindest idealerweise) bereits erfolgt sind,
bevor die Änderungen in den Release-Branch gelangt sind.
Ich weiß nicht, wie es andere OpenSource-Projekte machen ... aber für ein Projekt wie Freetz ist "agile Entwicklung" (zumindest beim "continuous delivery"-Aspekt) in meinen Augen einfach nicht geeignet. Das würde ja wieder bedeuten, daß man einfach für alle Benutzer genau das bereitstellt, was gerade da ist - ohne Rücksicht darauf, wie weit es fertig oder getestet ist (das hat dann Ähnlichkeit mit dem bisherigen Vorgehen, auch wenn
@er13 es meist geschafft hat, Inkonsistenzen zu vermeiden).
Das kann man dann machen, wenn die Zielgruppe sehr homogen ist hinsichtlich der Kenntnisse und Fertigkeiten (die auch noch gut entwickelt sein sollten) und sich bei Problemen tatsächlich selbst helfen kann; notfalls durch Verwenden eines älteren Standes. Das würde ich beim durchschnittlichen Freetz-Benutzer jetzt erst einmal nicht so sehen ... rein auf der Basis der hier immer mal wieder nachzulesenden Probleme.
Auch dürfte es bei Freetz dann eher so sein, daß da nicht jeden Tag ein neuer Stand entstehen würde (und der Benutzer damit die berechtigte Hoffnung hegen könnte, daß die Version von morgen die Probleme schon nicht mehr hat) ... wenn's schlecht läuft, müßten dann alle Benutzer(!), die sich nicht selbst helfen können, erst mal bis zur nächsten Version warten. Solange CI/CD (continuous integration / continuous delivery) nicht mit anderen Prinzipien der agilen Programmierung (z.B. Sprints, wo es tatsächlich täglich sichtbare Änderungen und einen neuen "daily build" gibt) Hand in Hand geht, bringt es (gerade auch bei einem Projekt wie Freetz, wo es ja kein fertiges Produkt zum Installieren gibt EDIT: und auch keine formalen (Unit-)Tests, die der aktuelle Stand bestehen könnte oder müßte) auch nichts.
Das heißt dann in der Konsequenz wieder, daß auch der Developer-Branch eigentlich "kein Spielplatz" ist und die "erste Präsentation" einer Änderung - und zwar bis zum erfolgreichen ersten Test auf wenigstens einer Box - in einem gesonderten "feature branch" erfolgt. Das müßte dann auch für Änderungen gelten, die eigentlich nur "fixes" sind - wobei letztere
nach gemeinsamem Review(!) auch ohne weiteren Test bereitgestellt werden könnten, wenn die Änderung logisch und eindeutig nachvollziehbar ist ... man muß die "Prinzipienreiterei" ja auch nicht übertreiben. Aber diese Arbeitsweise hat eben auch den (für mich unbestreitbaren) Vorteil, daß man so einen Branch mit einem Handgriff in seinen eigenen Klon zum Testen integrieren kann und ihn ebenso mit einem Handstreich wieder los wird, wenn man ihn doch nicht haben will oder er die Ursache eines Problems ist.
So sähe das zumindest nach meiner Ansicht in einer idealen Welt aus ... nur paßt halt Freetz im Moment auch von der Struktur her ganz schlecht zu diesem Vorgehen. Wenn jede neue Labor-Version von AVM (wo man ja im Moment wieder bei "weekly builds" angekommen ist, wie es scheint) auch eine neue Version von Freetz zur Folge hat, macht man sich schon bei diesem Aspekt der "Wartung" "einen Häßlichen" (so sagte man zumindest meinerzeit zu einer Sisyphos-Arbeit). Man kann so etwas also vermutlich auch nicht im Hauruck-Verfahren einführen, solange man das Projekt nicht so umgestellt hat, daß die Auswahl der gerade aktuellen Labor-Version für die jeweilige Box gleich direkt beim Freetz-Benutzer erfolgt. Das MUSS man ja nun nicht wirklich zentral machen, solange es keine tiefgreifenden Änderungen gibt, die mehr als nur den Austausch der als Vorlage dienenden AVM-Firmware erfordern.
===================================================
Das "Branchen" ist jedenfalls u.a. auch deshalb so wichtig "als Prinzip", weil man mit wenigen, ganz simplen Eingaben auf der Kommandozeile praktisch jeden beliebigen anderen Branch in den eigenen Klon mischen kann, solange es keine Konflikte (also widersprüchliche Änderungen) gibt. Wenn man z.B. meinen "yf_patchkernel"-Branch (mit dem LKM für das TUN-Device unter VR9 und GRX5) mit dem derzeitigen Freetz-Master zusammen haben wollte, sähe das in etwa so aus:
Code:
vidar:/tmp $ git clone https://github.com/freetz/freetz.git mein_klon
Cloning into 'mein_klon'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 141050 (delta 12), reused 14 (delta 6), pack-reused 141016
Receiving objects: 100% (141050/141050), 32.14 MiB | 10.41 MiB/s, done.
Resolving deltas: 100% (94408/94408), done.
vidar:/tmp $ cd mein_klon
vidar:/tmp $
Erst einmal wird (eine Eingabe) das Freetz-Repo lokal als "mein_klon" geklont (oben), dann wechselt man in das Git-Verzeichnis (wichtig und die zweite Eingabe) und definiert eine weitere Quelle mit einem anderen Repository, hier mit meinem Freetz-Fork auf GitHub:
Code:
vidar:/tmp/mein_klon $ git remote add -f yf https://github.com/PeterPawn/freetz.git
Updating yf
remote: Enumerating objects: 659, done.
remote: Counting objects: 100% (659/659), done.
remote: Total 1043 (delta 658), reused 659 (delta 658), pack-reused 384
Receiving objects: 100% (1043/1043), 3.44 MiB | 4.99 MiB/s, done.
Resolving deltas: 100% (756/756), completed with 204 local objects.
From https://github.com/PeterPawn/freetz
* [new branch] YourFritz -> yf/YourFritz
* [new branch] YourFritz_History -> yf/YourFritz_History
* [new branch] bb_mount -> yf/bb_mount
* [new branch] clearconfig -> yf/clearconfig
* [new branch] dropbear -> yf/dropbear
* [new branch] fix_patch_for_remove_mediasrv -> yf/fix_patch_for_remove_mediasrv
* [new branch] ltrace -> yf/ltrace
* [new branch] master -> yf/master
* [new branch] mc -> yf/mc
* [new branch] ncurses -> yf/ncurses
* [new branch] sqlite3 -> yf/sqlite3
* [new branch] submodules -> yf/submodules
* [new branch] uclibc_target -> yf/uclibc_target
* [new branch] wiki -> yf/wiki
* [new branch] yf_patchkernel -> yf/yf_patchkernel
* [new tag] v0.1 -> v0.1
vidar:/tmp/mein_klon $
Die Option "-f" beim "git remote add" sorgt dafür, daß sofort noch ein "git fetch" erfolgt, mit dem die Verwaltungsinformationen des neuen Repos geladen werden. Ohne diese Option müßte man noch ein "git fetch yf" (das "yf" ist hier der Name für diese zusätzliche Quelle) ausführen nach dem "git remote add".
Jetzt hat man die freie Auswahl aus den Branches in meinem Repo, welche man nun zu seinem eigenen Klon mischen will - ich nehme jetzt einfach mal den "yf_patchkernel" dazu:
Code:
vidar:/tmp/mein_klon $ git merge -m "merge yf_patchkernel" yf/yf_patchkernel
Merge made by the 'recursive' strategy.
config/ui/modules.in | 5 ++++
make/linux/configs/freetz/config-grx5-7590_07.01 | 1 +
make/linux/configs/freetz/config-vr9-7490_07.01 | 1 +
make/linux/patches/3.10.104/7590_07.01/900-patchkernel_source.patch | 1 +
make/linux/patches/3.10.104/7590_07.01/901-patchkernel_7590.patch | 1 +
make/linux/patches/3.10.107/7490_07.01/900-patchkernel_source.patch | 1 +
make/linux/patches/3.10.107/7490_07.01/901-patchkernel_7490.patch | 1 +
make/linux/patches/3.10.10x/900-patchkernel_source | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
make/linux/patches/3.10.10x/901-patchkernel_7490 | 30 ++++++++++++++++++++++
make/linux/patches/3.10.10x/901-patchkernel_7590 | 31 +++++++++++++++++++++++
make/openvpn-v2-cgi/files/root/etc/init.d/rc.openvpn | 9 +++++++
make/openvpn/Config.in | 5 ++--
12 files changed, 304 insertions(+), 2 deletions(-)
create mode 120000 make/linux/patches/3.10.104/7590_07.01/900-patchkernel_source.patch
create mode 120000 make/linux/patches/3.10.104/7590_07.01/901-patchkernel_7590.patch
create mode 120000 make/linux/patches/3.10.107/7490_07.01/900-patchkernel_source.patch
create mode 120000 make/linux/patches/3.10.107/7490_07.01/901-patchkernel_7490.patch
create mode 100644 make/linux/patches/3.10.10x/900-patchkernel_source
create mode 100644 make/linux/patches/3.10.10x/901-patchkernel_7490
create mode 100644 make/linux/patches/3.10.10x/901-patchkernel_7590
vidar:/tmp/mein_klon $ git show
commit 18ce6b856e744efbea4cf02fb32c5ef80d5a739f
Merge: 7a8fb9c74 c39fa484f
Author: YourFritz <[email protected]>
Date: Tue Feb 19 23:30:23 2019 +0100
merge yf_patchkernel
vidar:/tmp/mein_klon $
Nach dem Mischen erfolgt (wenn man es nicht "abbestellt") automatisch ein "commit" für die Änderungen, die Nachricht dafür steht hinter dem "-m", weil ich zu faul bin, die per Editor erst noch zu ändern. Am Ende hat man jetzt das originale Freetz, nur noch ergänzt um die Änderungen, die für "yf_patchkernel" erforderlich sind. Dafür braucht es vier Kommandos ... und zwar "from scratch", wenn man erst noch den Freetz-Master klonen muß oder will. Für jeden weiteren Branch aus einem anderen Repository braucht es noch genau zwei Kommandos.
Will man weitere Feature-Branches hinzunehmen für den eigenen Test, führt man einfach das "git merge" für jeden dieser Branches aus (man kann auch mehrere Branches mit einem Kommando hinzumischen) und wenn die in anderen Repositories liegen, muß man die nur zuvor mit "git remote add" auch noch hinzufügen. Hat man seinen Klon dann fertig, ruft man einfach wieder das "make menuconfig" auf, als würde man ausschließlich mit dem Freetz-Master arbeiten.
Die Arbeit mit mehr als einem Repository ist also "ganz normal", wenn man sich wirklich am Test neuer Feature-Branches beteiligen möchte. Zwar kann man auch direkt im Freetz-Repo weitere Branches aufmachen, in denen man mehrere (fremde) Feature-Branches zusammenfaßt und die interessierte Benutzer dann (anstelle des "master"-Branches) auschecken können nach dem Klonen (oder gleich dabei), aber das wird wohl eher selten der Fall sein, wenn es viele getrennte Repos und Branches sind.
Eingang in den "developer"-Branch (wo dann alle neuen Änderungen seit dem letzten Release zusammen getestet werden können) sollten solche Branches (bzw. die PRs dafür) aber auch erst dann finden, wenn sie wenigstens von einem weiteren Benutzer (und nicht nur dem Autoren selbst) erfolgreich getestet wurden.
Das klingt vielleicht alles etwas formalistisch und man muß es auch längst nicht so machen, wie ich es hier vorschlage ... nur würde eine solche Aufteilung (als Minimalvariante) auch sicherstellen, daß es für die Freetz-Benutzer mit dem "stable"-Wunsch immer eine Version gibt, während die Mutigen dann selbst entscheiden, ob sie zu den "early adopters" gehören wollen und die Branches aus den Repos anderer Developer testen oder ob sie nicht gleich die Ersten sein wollen und lieber etwas benutzen, was zwar deutlich "noch nicht fertig" ist, aber zumindest schon mal bei anderen die Tauglichkeit unter Beweis gestellt hat und daher im "developer"-Branch im Haupt-Repo zu finden ist.
Das sollte dann auch die Frage beantworten, wo man nun den "freigegebenen Stand" finden kann (der ja auch funktionieren sollte) ... nämlich wieder im Stamm-Repository des Projekts und wenn es dort keine Tags für Release-Versionen geben sollte, findet man die eben im "master" (so zumindest die empfohlene Arbeitsweise, wobei der "master" nicht automatisch so heißen muß - bei mir heißt der eben "YourFritz" im Fork).
Auch sollte jeder Inhaber eines Repos (zumindest wenn man dieses als Benutzer in Erwägung zieht als Quelle für eigene Software) in der Lage sein zu beschreiben, was seinen eigenen Fork nun eigentlich von der Stammversion unterscheidet (oder unterscheiden wird) ... und das auch entsprechend in einer README.md hinterlegt haben. Aber man kann ja auch als GitHub-"Kunde" bei einem geforkten Repository ganz einfach erkennen, ob das nun tatsächlich irgendwelche Änderungen enthält oder gar denselben Stand, wie das Quell-Repo. In der "Hauptseite" im GitHub-GUI steht bei einem Fork auch immer, ob und wenn ja, um wieviele Commits er sich von dem Repository unterscheidet, von dem er abstammt. Ist ein solcher Fork (bzw. Branch) also "even with Freetz:master", dann gibt es darin gar keine Änderungen ggü. der Quelle und man muß gar nicht weiter danach suchen, was den nun vom "originalen Freetz" unterscheidet. Idealerweise hat so ein Fork dann auch noch einen "sprechenden Namen" ... zumindest wenn sich die Beitragenden das jetzt angewöhnen, nachdem die Chance besteht, daß solche Branches tatsächlich direkt Eingang in das Stamm-Repo finden und nicht erst noch "umgearbeitet" werden bei der Übernahme im SVN (wo dann auch niemand mehr sehen konnte, wie der Branch für den PR im GitHub mal hieß).
Solange die Repos alle demselben Stammbaum angehören, kann man sich auch bereits mit dem GitHub-GUI davon überzeugen, ob es mit einem bestimmten Branch irgendwelche potentiellen Konflikte gibt und man (sofern man diese nicht selbst beheben will) von diesem Branch besser erst mal noch die Finger läßt.
Das mag dann - so als Hauruck-Aktion - auch erst mal etwas viel an Neuem sein, was dem bisherigen SVN-Benutzer hier "zugemutet" wird ... aber man muß sich eben überlegen, ob man nun dem SVN hinterhertrauern will oder ob man sich nicht doch einfach mal mit den wenigen Kommandos vertraut macht, die man als "Freetz-Benutzer" eigentlich nur braucht, um sich sein ureigenstes System aus dem "Freetz-Master" und irgendeinem anderen Branch (oder auch mehreren) zusammenzubauen.
Vergleicht man das mit dem Aufwand, den man auch als Freetz-Benutzer früher hatte, wenn man den Trunk verwenden wollte (oder mußte) und da noch weitere Patches aus irgendwelchen Trac-Tickets zuvor anzuwenden waren, ist das im GitHub nun mal deutlich einfacher ... da wird einem sofort angezeigt, wenn ein Branch nicht zum Rest passen würde und man kriegt das nicht erst dann mit, wenn das "patch"-Kommando irgendwelche Hunks verwirft und dabei am besten noch ein inkonsistenter Stand entsteht, weil ein Teil der Patches erfolgreich ist und ein anderer nicht.