dgit-user(7)

NAAM
dgit-user - maken en delen van wijzigingen aan Debian-pakketten, met git

INLEIDING
dgit laat u toe de broncode van elk pakket op uw systeem op te halen alsof uw distributie gebruik maakte van git om die allemaal te onderhouden.

U kunt deze broncode dan bewerken, bijgewerkte binaire pakketten (.deb's) bouwen en ze installeren en uitvoeren. U kunt uw werk ook delen met anderen.

Deze handleiding geeft hiervoor enkele procedures en suggesties. Ze gaat ervan uit dat u beschikt over basale noties van git. Ze veronderstelt niet dat u enigszins vertrouwd bent met de processen van pakketbeheer van Debian.

Indien u een pakketonderhouder bent binnen Debian, een Onderhouder (DM -Debian Maintainer) of Ontwikkelaar (DD - Debian Developper) van Debian, en/of iemand wiens werk gesponsord wordt, dan is deze handleiding niet voor u. Raadpleeg in dat geval dgit-nmu-simple(7), dgit-maint-*(7), of dgit(1) en dgit(7).

SAMENVATTING
(Deze runen worden later besproken.)

    % dgit clone glibc bookworm,-security
    % cd glibc
    % curl 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u
    % git commit -a -m 'Reparatie van libc-bug waarbij verlies van uitvoer optreedt'
    % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit
    % sudo apt-get build-dep .
    % dpkg-buildpackage -uc -b
    % sudo dpkg -i ../libc6_*.deb

Sporadisch:

    % git clean -xdf
    % git reset --hard

Later:

    % cd glibc
    % dgit pull bookworm,-security
    % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit
    % dpkg-buildpackage -uc -b
    % sudo dpkg -i ../libc6_*.deb

DE JUISTE BRONCODE VINDEN - DGIT CLONE
    % dgit clone glibc bookworm,-security
    % cd glibc

Aan dgit clone moet de naam van het broncodepakket opgegeven worden (die kan verschillen van de naam van het binaire pakket; het was deze laatste naam die u opgaf aan "apt-get install") en de codenaam of de alias van de Debian-release (welke men de "suite" noemt)

  De naam van het broncodepakket te weten komen
Bij veel pakketten is de naam van het broncodepakket voor de hand liggend. Anders kunt u hem opzoeken met dpkg, indien u een bestand kent dat in het pakket zit:

    % dpkg -S /lib/i386-linux-gnu/libc.so.6
    libc6:i386: /lib/i386-linux-gnu/libc.so.6
    % dpkg -s libc6:i386
    Package (Pakket): libc6
    Status (Toestand): install ok installed (geïnstalleerd)
    ...
    Source (Bron): glibc

(In dit voorbeeld is libc6 een pakket van het type "multi-arch: allowed", hetgeen betekent dat het voorkomt in verschillende andere vormen/compilaties voor verschillende architecturen. Daarvandaan komt ":i386".)

  De Debian-release (de "suite") te weten komen
Intern verwijzen Debian (en de ervan afgeleide distributies) gewoonlijk naar hun releases met een codenaam. Debian gebruikt ook aliassen die verwijzen naar de huidige stabiele release, enz. Bijvoorbeeld, bij het schrijven van deze handleiding was Debian "bookworm" (Debian 12) Debian "stable" (de stabiele uitgave van Debian), en was de actuele versie van Ubuntu "plucky" (Plucky Puffin, 25.04). U kunt zowel de codenaam "bookworm" als de alias "stable" opgeven. Indien u niets opgeeft, dan krijgt u "sid", welke Debian "unstable" is - de centrale tak van de voortgaande ontwikkeling.

Als u niet weet welke versie u gebruikt, raadpleeg dan uw apt-configuratie in /etc/apt/sources* of in /etc/debian_version.

Voor Debian moet u aan het eind van de naam van de suite ",-security" toevoegen, tenzij u met de suite unstable of testing werkt. Dus in ons voorbeeld wordt "bookworm" "bookworm,-security". (Wel degelijk met de komma.)

WAT DGIT CLONE AANMAAKT

  Welke takken er zijn
dgit clone zal voor u een verse werkkopie aanmaken en ervoor zorgen dat u zich bevindt op een tak met een naam als "dgit/bookworm,-security" (inderdaad, met een komma in de naam van de tak).

Voor elke release (zoals "bookworm") bestaat een meelopende tak voor de inhoud van het archief, genoemd "remotes/dgit/dgit/bookworm" (en net zo voor andere suites). Deze kan bijgewerkt worden met "dgit fetch bookworm". Deze, de externe suitetak, wordt samengesteld door uw lokale kopie van dgit. Een lineaire veranderingsgeschiedenis wordt opgebouwd (N.v.d.V.: fast forwarding in git-terminologie).

De veiligheidsupdates worden door Debian afgezonderd in "*-security". Aan dgit de opdracht "bookworm,-security" geven, betekent dat het de eventueel in "bookworm-security" aanwezige updates moet opnemen. De notatie met de komma houdt de vraag aan dgit in om bookworm op te volgen of bookworm-security als zich daarin een update voor het pakket bevindt.

(U kunt ook het commando dgit fetch gebruiken in een mappenboom die niet door git clone aangemaakt werd. Indien daarin geen "debian/changelog" aanwezig is, zult u met dgit fetch de optie "-p"pakket moeten gebruiken.)

  Welk soort broncodeboom u verkrijgt
Indien het Debian-pakket gebaseerd is op een release van een toeleveraar, dan zal de indeling van de broncode eruit zien als die van de versie van de toeleveraar. U kunt zich laten helpen door "git grep" om uit te zoeken waar u met bewerken wilt beginnen.

De metagegevens van Debian over het pakket en de scripts voor het bouwen van de binaire pakketten bevinden zich in "debian/". Aanknopingspunten zijn "debian/control", "debian/changelog" en "debian/rules". In het beleidshandboek van Debian vindt u meestal de nodige diepgaande technische informatie.

Bij veel Debian-pakketten zijn ook zaken te vinden in "debian/patches/". U kunt deze best negeren. Voor zover deze relevant zijn, zullen deze toegepast zijn in de eigenlijke bestanden, vermoedelijk via feitelijke vastleggingen in de git-geschiedenis. Wanneer binaire pakketten gebouwd worden vanuit met dgit verkregen git-takken, wordt de inhoud van debian/patches genegeerd.

(Voor Debian-ingewijden: de git-boomstructuren die met dgit verkregen worden zijn "verpakkingstakken met toegepaste patches, maar zonder .pc-map".)

  Welk soort geschiedenis u verkrijgt
Indien u geluk heeft, zal de geschiedenis een versie zijn van, of gebaseerd zijn op de eigen git-geschiedenis van de pakketonderhouder van Debian, of van de git-geschiedenis van de toeleveraar.

Maar van veel pakketten bestaat geen echte git-geschiedenis of werd die niet in een dgit-achtige vorm gepubliceerd. Het is dus mogelijk dat u vaststelt dat de geschiedenis eerder kort is en door dgit bedacht.

dgit-geschiedenissen bevatten vaak automatisch gegenereerde vastleggingen (commits), met inbegrip van vastleggingen die geen wijzigingen aanbrengen, maar enkel dienen om een zich herintegrerende aftakking in te passen in de lineaire vorm van de veranderingsgeschiedenis (N.v.d.V.: "make a rebasing branch fast-forward" in git-terminologie). Dit is in het bijzonder het geval bij gecombineerde takken zoals "bookworm,-security".

Indien de pakketonderhouder gebruik maakt van git, dan kunt u na een dgit clone een handig "vcs-git" remote opmerken, wat verwijst naar het git-archief waarvan de pakketonderhouder gebruik maakt voor het pakket. U kunt zien wat zich daar bevindt met "git fetch vcs-git". Maar gebruik wat u daar vindt met zorg: de git-archieven van onderhouders van Debian bevatten vaak zaken die erg verwarrend en zonderling kunnen zijn. In het bijzonder zult u mogelijk handmatig de patches moeten toepassen die zich in debian/patches bevinden voor u iets anders doet!

BOUWPROCES

  Leg steeds veranderingen vast (N.v.d.V.: "commit" in git-terminologie) voor u begint te bouwen
    % wget 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=28250;mbox=yes;msg=89' | patch -p1 -u
    % git commit -a -m 'Reparatie van libc-bug waarbij verlies van uitvoer optreedt'

Het bouwproces van een Debian-pakket verloopt vaak erg rommelig: het kan bestanden wijzigen die ook vastgelegd zijn in git of uitvoer en tijdelijke bestanden achterlaten die niet door ".gitignore" afgedekt zijn.

Indien u steeds een vastlegging doet, kunt u gebruik maken van

    % git clean -xdf
    % git reset --hard

om na het bouwproces een opruimactie te doen. (Indien u vergat vast te leggen, gebruik dan deze commando's niet; in de plaats kunt u misschien "git add -p" gebruiken om te helpen vastleggen wat u werkelijk wenst te bewaren.)

Dit zijn verwoestende commando's die alle nieuwe bestanden wissen (dus moet u eraan denken om "git add") uit te voeren) en elke aanpassing aan een bestand weggooien (u moet er dus aan denken om een vastlegging uit te voeren).

  Werk het bestand changelog (minstens eenmaal) bij voor u bouwt
    % gbp dch -S --since=dgit/dgit/sid --ignore-branch --commit

De binaire pakketten welke u bouwt zullen een versienummer hebben dat uiteindelijk afkomstig is uit het bestand "debian/changelog". U wilt toch uw binaire pakketten kunnen onderscheiden van die van uw distributie.

En dus moet u "debian/changelog" bijwerken en er bovenaan een item toevoegen voor u de bouw uitvoert.

Deze rune geeft een makkelijke manier om dit te doen. Het voegt een nieuw item toe aan changelog met een niet-informatieve mededeling en een plausibel versienummer (dat een stukje van het id van uw vastlegging bevat).

Indien u een meer gesofisticeerde manier wilt, biedt het pakket "dpkg-dev-el" een goede Emacs-modus voor het bewerken van changelogs. U kunt anders de changelog ook bewerken met een andere teksteditor, of "dch" of "gbp dch" uitvoeren met verschillende opties. Het kiezen van een goed versienummer is een beetje een netelige kwestie en een volledige behandeling van dit onderwerp valt buiten het bestek van deze handleiding.

  Het eigenlijke bouwen
    % sudo apt-get build-dep .
    % dpkg-buildpackage -uc -b

dpkg-buildpackage is het belangrijkste gereedschap voor het bouwen van een Debian-broncodepakket. "-uc" betekent: geen pgp-ondertekening toevoegen aan de resultaten. "-b" betekent: alle binaire pakketten bouwen, maar geen broncodepakket.

  Gebruik maken van sbuild
In plaats van in uw hoofdomgeving, kunt u de bouw uitvoeren in een "schroot chroot" met sbuild (sbuild wordt door de build-achtergronddiensten van Debian gebruikt.)

    % git clean -xdf
    % sbuild -c trixie -A --no-clean-source \
             --dpkg-source-opts='-Zgzip -z1 --format=1.0 -sn'

Merk op dat dit een "broncodepakket" (.dsc en .tar.gz) lijkt achter te laten in de bovenliggende map, maar u moet dit broncodepakket niet gebruiken. Waarschijnlijk is het defect. Zie voor bijkomende informatie Debian-bug #868527.

INSTALLEREN
    % sudo apt install ../libc6_*.deb

U kunt "dpkg -i" gebruiken om de .deb-bestanden te installeren die uit uw pakket voortkwamen.

Indien de vereisten niet geïnstalleerd zijn, zult u een foutmelding krijgen die gewoonlijk gerepareerd kan worden met "apt-get -f install".

Multiarch
Indien u aan een bibliotheekpakket werkt en op uw systeem multi-architectuurondersteuning geactiveerd is, krijgt u mogelijk iets te zien als dit:

    dpkg: fout bij verwerken van pakket libpcre3-dev:amd64 (--configure):
     pakket libpcre3-dev:amd64 2:8.39-3~3.gbp8f25f5 kan niet geconfigureerd worden omdat libpcre3-dev:i386 een andere versie (2:8.39-2) heeft

Het multi-architectuursysteem dat door Debian toegepast wordt, vereist dat elk pakket dat voor meerdere architecturen aanwezig is, exact hetzelfde is bij alle architecturen waarvoor het geïnstalleerd is.

De geëigende oplossing is om het pakket te bouwen voor alle architecturen die u geactiveerd heeft. U zult een chroot nodig hebben voor elk van de secundaire architecturen. Dit is enigszins vermoeiend, ook al beschikt Debian over uitstekende hulpmiddelen voor het beheren van chroots. Goede aanknopingspunten zijn "sbuild-debian-developer-setup" uit het pakket met dezelfde naam en "sbuild-createchroot" uit het pakket "sbuild".

Een andere mogelijkheid is dat u de betreffende pakketten bij de andere architecturen de-installeert met iets zoals "dpkg --remove libpcre3:i386".

Indien geen van beide mogelijkheden een optie is, dan is een mogelijke laatste wanhoopsdaad, voor uw eigen pakket hetzelfde versienummer gebruiken als van het officiële pakket. Dit is niet ideaal omdat dit het moeilijk maakt om te weten wat geïnstalleerd is, en omdat het apt zal misleiden en in de war brengen.

Met de "hetzelfde-nummer"-benadering kunt u nog steeds foutmeldingen krijgen zoals

    poging tot overschrijven van gedeelde '/usr/include/pcreposix.h', welke verschilt van andere exemplaren van pakket libpcre3-dev

maar de optie "--force-overwrite" meegeven aan dpkg zal helpen - in de veronderstelling dat u weet wat u doet.

UW WERK DELEN
De tak "dgit/bookworm,-security" (of wat dan ook) is een gewone git-tak. U kunt "git push" gebruiken om hem te publiceren op elke geschikte git-server.

Iedereen die deze git-tak van u krijgt, zal in staat zijn om binaire pakketten (.deb) te bouwen, zoals u het deed.

Indien u uw wijzigingen terug wilt bijdragen aan Debian, dan zult u ze wellicht als bijlage bij een e-mail moeten sturen naar het Debian Bugvolgsysteem <https://bugs.debian.org/> (ofwel als opvolging van een bestaande bug, of als een nieuwe bug). Patches in de indeling "git-format-patch" zijn gewoonlijk erg welkom.

  Broncodepakketten
De git-tak volstaat niet om een broncodepakket te bouwen volgens de manier van Debian. Broncodepakketten zijn wat lastig om ermee te werken. Vele aannemelijke git-geschiedenissen of git-bomen kunnen namelijk niet omgezet worden naar een geschikt broncodepakket. Dus beveel ik aan om in de plaats daarvan uw git-tak te delen.

Indien een git-tak niet voldoende is en u een broncodepakket moet aanleveren, maar het formaat/de indeling ervan niet van belang is (bijvoorbeeld omdat u bepaalde software heeft die met broncodepakketten werkt en niet met git-geschiedenissen), kunt u deze methode gebruiken om een broncodepakket van het type "3.0 (native)" te genereren. Dit is niet meer dan een tar-archief met een bijhorend .dsc-metadatabestand:

    % echo '3.0 (native)' >debian/source/format
    % git commit -m 'overgang naar de broncode-indeling native' debian/source/format
    % dgit -wgf build-source

Indien u een goed ogend broncodepakket moet aanleveren, dan zult u bereid moeten zijn er heel wat meer werk in te investeren. U zult heel wat meer moeten lezen, misschien te beginnen bij dgit-nmu-simple(7), dgit-sponsorship(7) of dgit-maint-*(7)

NIEUWERE DGIT INSTALLEREN OP OUDERE DISTRIBUTIES
Als dgit niet werkt met het bronpakket waarmee u werkt, kan dit te wijten zijn aan een bug. Deze kan worden verholpen door een upgrade.

U kunt waarschijnlijk rechtstreeks de nieuwste versie van dgit.deb installeren via "apt install" vanuit Debian stable of Debian testing.

Versies van dgit vanaf Debian 13 (trixie) documenteren hun installeerbaarheid op oude releases in de manpagina. Zie bijvoorbeeld <https://manpages.debian.org/testing/dgit/dgit.1.en.html> voor het huidige Debian testing en kijk in de sectie ONDERSTEUNING OP OUDE DISTRIBUTIES..

ZIE OOK
dgit(1), dgit(7)