Chapters ▾ 2nd Edition

6.3 GitHub - Förvalta ett projekt

Förvalta ett projekt

Nu när vi är bekväma med att bidra till ett projekt tittar vi på den andra sidan: skapa, förvalta och administrera ditt eget projekt.

Skapa ett nytt kodförråd

Låt oss skapa ett nytt kodförråd för att dela vår projektkod. Börja med att klicka på knappen "Nytt kodförråd" på högersidan av översikten, eller på +-knappen i den övre verktygsraden bredvid ditt användarnamn som i Rullgardinen "Nytt kodförråd".

Området "Dina kodförråd"
Figur 107. Området "Dina kodförråd"
Rullgardinen "Nytt kodförråd"
Figur 108. Rullgardinen "Nytt kodförråd"

Detta tar dig till formuläret "nytt kodförråd":

Formuläret "nytt kodförråd"
Figur 109. Formuläret "nytt kodförråd"

Allt du egentligen behöver göra här är att ange ett projektnamn; resten av fälten är helt valfria. Klicka sedan på knappen "Skapa kodförråd" och klart — du har ett nytt kodförråd på GitHub med namnet <användare>/<projektnamn>.

Eftersom du inte har någon kod där än visar GitHub instruktioner för hur du skapar ett helt nytt Git-kodförråd eller kopplar ett befintligt Git-projekt. Vi uppehåller oss inte vid det här; om du behöver en uppfräschning, se Grunderna i Git.

Nu när ditt projekt ligger på GitHub kan du ge URL:en till vem du vill dela projektet med. Varje projekt på GitHub går att nå över HTTPS som https://github.com/<användare>/<projektnamn>, och över SSH som git@github.com:<användare>/<projektnamn>. Git kan uppdatera från och skicka till båda dessa URL:er, men åtkomsten styrs av vilka inloggningsuppgifter användaren har.

Notera

För publika projekt är det ofta bättre att dela HTTPS-adressen, eftersom användaren inte behöver ett GitHub-konto för att klona. Användare måste ha ett konto och en uppladdad SSH-nyckel för att nå ditt projekt om du ger dem SSH-adressen. HTTPS-adressen är dessutom exakt samma URL de skulle klistra in i webbläsaren för att titta på projektet.

Lägg till medarbetare

Om du arbetar med andra som du vill ge rätt att checka in behöver du lägga till dem som medarbetare ("collaborators"). Om Ben, Jeff och Louise skapar konton på GitHub och du vill ge dem rätt att skicka till ditt kodförråd kan du lägga till dem i projektet. Det ger dem "skicka"-rättigheter, vilket betyder att de har både läs- och skrivrättigheter till projektet och Git-kodförrådet.

Klicka på länken "Inställningar" längst ned i den högra sidopanelen.

Länken för kodförrådsinställningar
Figur 110. Länken för kodförrådsinställningar

Välj sedan "Medarbetare" i menyn till vänster. Skriv in ett användarnamn i rutan och klicka på "Lägg till medarbetare". Du kan upprepa detta så många gånger du vill för att ge åtkomst till alla du vill. Om du behöver dra tillbaka åtkomst klickar du bara på "X" till höger om deras rad.

Ruta för kodförrådets medarbetare
Figur 111. Ruta för kodförrådets medarbetare

Hantera ändringsförfrågningar

Nu när du har ett projekt med lite kod i och kanske till och med några medarbetare som också kan skicka, går vi igenom vad du gör när du själv får en ändringsförfrågan.

Ändringsförfrågningar kan komma antingen från en gren i en avgrening av ditt kodförråd eller från en annan gren i samma kodförråd. Den enda skillnaden är att de som kommer från en avgrening ofta kommer från personer där du inte kan skicka till deras gren och de inte kan skicka till din, medan vid interna ändringsförfrågningar har båda parter i regel åtkomst till grenen.

För exemplen antar vi att du är "tonychacon" och att du har skapat ett nytt Arduino-projekt som heter "fade".

E-postaviseringar

Någon gör en ändring i din kod och skickar en ändringsförfrågan till dig. Du bör få ett e-postmeddelande som informerar om den nya ändringsförfrågan och det bör se ut ungefär som E-postavisering om en ny ändringsförfrågan.

E-postavisering om en ny ändringsförfrågan
Figur 112. E-postavisering om en ny ändringsförfrågan

Det finns några saker att lägga märke till i det här e-postmeddelandet. Det ger dig en liten diffstatistik — en lista över filer som har ändrats i ändringsförfrågan och hur mycket. Det ger dig en länk till ändringsförfrågan på GitHub. Det ger dig också några URL:er du kan använda från kommandoraden.

Om du tittar på raden som säger git pull <url> patch-1 är det ett enkelt sätt att sammanfoga en fjärrgren utan att lägga till ett fjärrkodförråd. Vi tog upp detta kort i Checka ut fjärrgrenar. Om du vill kan du skapa och byta till en ämnesgren och sedan köra detta kommando för att sammanfoga ändringsförfrågans ändringar.

De andra intressanta URL:erna är .diff- och .patch-adresserna, som ger sammanfogad diff respektive ändringspatchversion av ändringsförfrågan. Du skulle rent tekniskt kunna sammanfoga ändringsförfrågans arbete med något som:

$ curl https://github.com/tonychacon/fade/pull/1.patch | git am

Samarbeta kring ändringsförfrågan

Som vi beskrev i GitHub-flödet kan du nu ha en dialog med personen som öppnade ändringsförfrågan. Du kan kommentera specifika kodrader, kommentera hela incheckningar eller kommentera hela ändringsförfrågan, och använda GitHub-anpassad Markdown överallt.

Varje gång någon annan kommenterar ändringsförfrågan får du fortsatt e-postaviseringar så att du vet att det händer något. De kommer var och en att ha en länk till ändringsförfrågan där aktiviteten pågår, och du kan också svara direkt på e-postmeddelandet för att kommentera i ändringsförfrågans tråd.

Svar på e-post inkluderas i tråden
Figur 113. Svar på e-post inkluderas i tråden

När koden är där du vill ha den och du vill sammanfoga den kan du antingen dra ner koden och sammanfoga den lokalt, antingen med syntaxen git pull <url> <gren> som vi såg tidigare, eller genom att lägga till avgreningen som fjärrkodförråd och uppdatera och sammanfoga.

Om sammanslagningen är trivial kan du också bara trycka på knappen "Sammanfoga" på GitHubs webbplats. Det gör en icke-snabbspolad sammanslagning, vilket skapar en sammanslagningsincheckning även om en snabbspolning varit möjlig. Det betyder att oavsett vad skapas en sammanslagningsincheckning varje gång du trycker på sammanslagningsknappen. Som du ser i Sammanslagningsknapp och instruktioner för att sammanfoga en ändringsförfrågan manuellt ger GitHub all denna information om du klickar på hintlänken.

Sammanslagningsknapp och instruktioner för att sammanfoga en ändringsförfrågan manuellt
Figur 114. Sammanslagningsknapp och instruktioner för att sammanfoga en ändringsförfrågan manuellt

Om du bestämmer dig för att inte sammanfoga kan du också bara stänga ändringsförfrågan och personen som öppnade den får en avisering.

Referenser för ändringsförfrågningar

Om du hanterar många ändringsförfrågningar och inte vill lägga till en massa fjärrkodförråd eller göra engångsdragningar varje gång finns det ett snyggt knep som GitHub låter dig använda. Det här är lite avancerat och vi går igenom detaljerna mer i Refspecen, men det kan vara mycket användbart.

GitHub exponerar ändringsförfrågegrenar för ett kodförråd som en slags pseudogrenar på servern. Som standard får du dem inte när du klonar, men de finns där på ett mer dolt sätt och du kan komma åt dem ganska enkelt.

För att demonstrera detta använder vi ett lågnivåkommando (plumbing‑kommando, som vi läser mer om i Lågnivådel och användardel) som heter ls-remote. Det kommandot används normalt inte i vardagliga Git-operationer, men det är användbart för att visa vilka referenser som finns på servern.

Om vi kör detta kommando mot "blink"-kodförrådet vi använde tidigare får vi en lista över alla grenar, taggar och andra referenser i kodförrådet.

$ git ls-remote https://github.com/schacon/blink
10d539600d86723087810ec636870a504f4fee4d	HEAD
10d539600d86723087810ec636870a504f4fee4d	refs/heads/master
6a83107c62950be9453aac297bb0193fd743cd6e	refs/pull/1/head
afe83c2d1a70674c9505cc1d8b7d380d5e076ed3	refs/pull/1/merge
3c8d735ee16296c242be7a9742ebfbc2665adec1	refs/pull/2/head
15c9f4f80973a2758462ab2066b6ad9fe8dcf03d	refs/pull/2/merge
a5a7751a33b7e86c5e9bb07b26001bb17d775d1a	refs/pull/4/head
31a45fc257e8433c8d8804e3e848cf61c9d3166c	refs/pull/4/merge

Om du är i ditt kodförråd och kör git ls-remote origin eller vilket fjärrkodförråd du vill kontrollera ser det liknande ut.

Om kodförrådet ligger på GitHub och du har några öppna ändringsförfrågningar får du dessa referenser med prefixet refs/pull/. Det här är i praktiken grenar, men eftersom de inte ligger under refs/heads/ får du dem inte normalt när du klonar eller uppdaterar från servern — uppdateringen ignorerar dem normalt.

Det finns två referenser per ändringsförfrågan - den som slutar på /head pekar på exakt samma incheckning som den sista incheckningen i ändringsförfrågans gren. Så om någon öppnar en ändringsförfrågan i vårt kodförråd och deras gren heter bug-fix och pekar på incheckningen a5a775, kommer vi i vårt kodförråd inte ha någon gren bug-fix (den ligger i deras avgrening), men vi kommer ha pull/<pr#>/head som pekar på a5a775. Det betyder att vi ganska enkelt kan dra ner varje ändringsförfrågegren i ett svep utan att behöva lägga till en massa fjärrkodförråd.

Nu kan du till exempel uppdatera referensen direkt.

$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
 * branch            refs/pull/958/head -> FETCH_HEAD

Det här säger till Git: "Anslut till fjärrkodförrådet origin och uppdatera referensen refs/pull/958/head." Git lyder och uppdaterar allt du behöver för att bygga referensen, och lägger en pekare till den incheckning du vill ha i .git/FETCH_HEAD. Du kan följa upp med git merge FETCH_HEAD in i en gren du vill testa i, men sammanslagningsmeddelandet ser lite konstigt ut. Om du granskar många ändringsförfrågningar blir det dessutom tröttsamt.

Det finns också ett sätt att uppdatera alla ändringsförfrågningar och hålla dem uppdaterade varje gång du ansluter till fjärrkodförrådet. Öppna .git/config i din favoritredigerare och leta efter fjärrkodförrådet origin. Den bör se ut ungefär så här:

[remote "origin"]
    url = https://github.com/libgit2/libgit2
    fetch = +refs/heads/*:refs/remotes/origin/*

Raden som börjar med fetch = är en "referensspecifikation". Det är ett sätt att mappa namn på fjärrkodförrådet till namn i din lokala .git-katalog. Den här berättar för Git att "det som ligger i fjärrkodförrådet under refs/heads ska hamna i mitt lokala kodförråd under `refs/remotes/origin`". Du kan ändra detta avsnitt för att lägga till ytterligare en referensspecifikation:

[remote "origin"]
    url = https://github.com/libgit2/libgit2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Den sista raden säger till Git: "Alla referenser som ser ut som refs/pull/123/head ska lagras lokalt som refs/remotes/origin/pr/123." Om du nu sparar filen och kör git fetch:

$ git fetch
# …
 * [new ref]         refs/pull/1/head -> origin/pr/1
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/4/head -> origin/pr/4
# …

Nu representeras alla ändringsförfrågningar från fjärrkodförrådet lokalt med referenser som fungerar ungefär som spårande grenar; de är skrivskyddade och uppdateras när du gör en uppdatering. Det gör det väldigt enkelt att testa koden från en ändringsförfrågan lokalt:

$ git checkout pr/2
Checking out files: 100% (3769/3769), done.
Branch pr/2 set up to track remote branch pr/2 from origin.
Switched to a new branch 'pr/2'

Den vaksamme noterar head i slutet av fjärrdelen av referensspecifikationen. Det finns också en refs/pull/#/merge-referens på GitHub-sidan, som representerar den incheckning som skulle skapas om du trycker på knappen "Sammanfoga" på webbplatsen. Det gör att du kan testa sammanslagningen innan du ens trycker på knappen.

Ändringsförfrågningar på ändringsförfrågningar

Du kan inte bara öppna ändringsförfrågningar som riktar sig mot huvudgrenen eller master-grenen, du kan öppna en ändringsförfrågan mot vilken gren som helst i nätverket. Faktum är att du till och med kan rikta mot en annan ändringsförfrågan.

Om du ser en ändringsförfrågan som rör sig i rätt riktning och du har en idé om en ändring som beror på den, eller om du inte är säker på att idén är bra, eller om du helt enkelt inte har skrivrättigheter till målgrenen, kan du öppna en ändringsförfrågan direkt mot den.

När du öppnar en ändringsförfrågan finns det en ruta högst upp på sidan som anger vilken gren du begär att dra in till och vilken du begär att dra in från. Om du klickar på knappen "Edit" till höger om rutan kan du ändra inte bara grenarna utan även vilken avgrening.

Ändra målavgrening och målgren för ändringsförfrågan manuellt
Figur 115. Ändra målavgrening och målgren för ändringsförfrågan manuellt

Här kan du ganska enkelt ange att sammanfoga din nya gren i en annan ändringsförfrågan eller en annan avgrening av projektet.

Omnämnanden och aviseringar

GitHub har också ett ganska bra aviseringssystem som kan vara till hjälp när du har frågor eller behöver återkoppling från specifika personer eller team.

I valfri kommentar kan du börja skriva tecknet @ och då börjar det autokomplettera med namn och användarnamn på personer som är medarbetare eller bidragslämnare i projektet.

Börja skriva @ för att nämna någon
Figur 116. Börja skriva @ för att nämna någon

Du kan också nämna en användare som inte finns i listan, men autokompletteringen går ofta snabbare.

När du publicerar en kommentar med ett användarnamn får den användaren en notis. Det innebär att detta är ett mycket effektivt sätt att dra in människor i samtal i stället för att få dem att hålla koll själva. I ändringsförfrågningar på GitHub drar folk ofta in andra personer i sina team eller sin organisation för att granska ett ärende eller en ändringsförfrågan.

Om någon nämns i en ändringsförfrågan eller ett ärende blir de "prenumererade" på den och får fortsatt aviseringar varje gång aktivitet sker där. Du blir också prenumerant om du öppnade den, om du följer kodförrådet eller om du kommenterar något. Om du inte längre vill få aviseringar finns en "Avprenumerera"-knapp på sidan som du kan klicka för att sluta få uppdateringar.

Avprenumerera från ett ärende eller en ändringsförfrågan
Figur 117. Avprenumerera från ett ärende eller en ändringsförfrågan

Aviseringssidan

När vi pratar om aviseringar i GitHub menar vi ett särskilt sätt som GitHub försöker nå dig när händelser inträffar, och det finns flera sätt du kan konfigurera det. Om du går till fliken "Aviseringscenter" från inställningssidan kan du se några av de alternativ du har.

Alternativ i aviseringscenter
Figur 118. Alternativ i aviseringscenter

De två valen är att få aviseringar via "E-post" och via "Webb", och du kan välja antingen, inget eller båda för sådant du aktivt deltar i och för aktivitet i kodförråd du följer.

Webbaserade aviseringar

Webbaviseringar finns bara på GitHub och du kan bara se dem där. Om du har detta alternativ valt i dina inställningar och en avisering utlöses ser du en liten blå prick över aviseringsikonen längst upp på skärmen, som i Aviseringscenter.

Aviseringscenter
Figur 119. Aviseringscenter

Om du klickar på den får du en lista över alla objekt du har fått aviseringar om, grupperade per projekt. Du kan filtrera aviseringarna för ett specifikt projekt genom att klicka på projektnamnet i vänsterspalten. Du kan också bekräfta aviseringen genom att klicka på bockikonen bredvid en avisering, eller bekräfta alla aviseringar i ett projekt genom att klicka på bocken längst upp i gruppen. Det finns också en tystknapp bredvid varje bock som du kan klicka på för att inte få fler aviseringar om det objektet.

Alla dessa verktyg är mycket användbara för att hantera stora mängder aviseringar. Många avancerade GitHub-användare stänger helt enkelt av e-postnotiser och hanterar alla sina aviseringar via den här skärmen.

E-postaviseringar

E-postaviseringar är det andra sättet du kan hantera aviseringar via GitHub. Om du har detta på får du e-post för varje avisering. Vi såg exempel på detta i Kommentarer skickade som e-postaviseringar och E-postavisering om en ny ändringsförfrågan. E-postmeddelandena kommer också att trådas korrekt, vilket är trevligt om du använder en e-postklient med trådning.

Det finns också en hel del metadata inbäddat i rubrikerna i de e-postmeddelanden som GitHub skickar, vilket kan vara väldigt användbart för att sätta upp egna filter och regler.

Om vi till exempel tittar på de faktiska e-postrubrikerna som skickades till Tony i e-postmeddelandet i E-postavisering om en ny ändringsförfrågan ser vi bland annat följande:

To: tonychacon/fade <fade@noreply.github.com>
Message-ID: <tonychacon/fade/pull/1@github.com>
Subject: [fade] Wait longer to see the dimming effect better (#1)
X-GitHub-Recipient: tonychacon
List-ID: tonychacon/fade <fade.tonychacon.github.com>
List-Archive: https://github.com/tonychacon/fade
List-Post: <mailto:reply+i-4XXX@reply.github.com>
List-Unsubscribe: <mailto:unsub+i-XXX@reply.github.com>,...
X-GitHub-Recipient-Address: tchacon@example.com

Det finns ett par intressanta saker här. Om du vill markera eller omdirigera e-post för just det här projektet eller till och med en ändringsförfrågan ger informationen i Message-ID dig allt i formatet <användare>/<projekt>/<typ>/<id>. Om det till exempel var ett ärende skulle fältet <typ> ha varit "issues" i stället för "pull".

Fälten List-Post och List-Unsubscribe innebär att om du har en e-postklient som förstår dem kan du enkelt posta till listan eller "avprenumerera" från tråden. Det är i praktiken samma sak som att klicka på "tyst"-knappen i webbversionen av aviseringen eller "Avprenumerera" på ärende- eller ändringsförfrågesidan.

Det är också värt att notera att om du har både e-post- och webbaviseringar aktiverade och du läser e-postversionen av aviseringen kommer webbversionen att markeras som läst också, om du tillåter bilder i din e-postklient.

Särskilda filer

Det finns ett par särskilda filer som GitHub lägger märke till om de finns i ditt kodförråd.

README

Den första är README-filen, som kan vara i nästan vilket format som helst som GitHub känner igen som brödtext. Till exempel kan den vara README, README.md, README.asciidoc och så vidare. Om GitHub ser en README-fil i källkoden renderar den den på projektets startsida.

Många team använder den här filen för att samla all relevant projektinformation för någon som kan vara ny i kodförrådet eller projektet. Det inkluderar vanligtvis saker som:

  • Vad projektet är till för

  • Hur man konfigurerar och installerar det

  • Ett exempel på hur man använder det eller får det att köra

  • Vilken licens projektet ges ut under

  • Hur man bidrar till det

Eftersom GitHub renderar den här filen kan du bädda in bilder eller länkar i den för att göra det lättare att förstå.

CONTRIBUTING

Den andra specialfilen som GitHub känner igen är CONTRIBUTING-filen. Om du har en fil som heter CONTRIBUTING med valfritt filändelse kommer GitHub visa Öppna en ändringsförfrågan när en CONTRIBUTING-fil finns när någon börjar öppna en ändringsförfrågan.

Öppna en ändringsförfrågan när en CONTRIBUTING-fil finns
Figur 120. Öppna en ändringsförfrågan när en CONTRIBUTING-fil finns

Tanken är att du kan ange specifika saker du vill eller inte vill ha i en ändringsförfrågan som skickas till ditt projekt. På så vis kan folk läsa riktlinjerna innan de öppnar ändringsförfrågan.

Projektadministration

I allmänhet finns det inte så mycket administrativt du kan göra med ett enskilt projekt, men det finns några saker som kan vara intressanta.

Ändra standardgren

Om du använder en annan gren än "master" som standardgren som du vill att folk ska öppna ändringsförfrågningar mot eller se som standard kan du ändra det på inställningssidan för ditt kodförråd under fliken "Options".

Ändra standardgren för ett projekt
Figur 121. Ändra standardgren för ett projekt

Ändra standardgrenen i rullgardinen så blir den standard för alla större operationer framöver, inklusive vilken gren som växlas till som standard när någon klonar kodförrådet.

Flytta ett projekt

Om du vill flytta ett projekt till en annan användare eller en organisation i GitHub finns ett alternativ "Transfer ownership" längst ned på samma flik "Options" i kodförrådets inställningar som låter dig göra detta.

Flytta ett projekt till en annan GitHub-användare eller organisation
Figur 122. Flytta ett projekt till en annan GitHub-användare eller organisation

Det här är användbart om du överger ett projekt och någon vill ta över det, eller om ditt projekt växer och du vill flytta det till en organisation.

Detta flyttar inte bara kodförrådet tillsammans med alla följare och stjärnor till en annan plats, det sätter också upp en omdirigering från din URL till den nya platsen. Det omdirigerar också klonningar och uppdateringar i Git, inte bara webbförfrågningar.