GitHubs brugervenlige kommandolinjeværktøj: "gh"!

Hvis du har brugt GitHub og foretrækker kommandolinjen som mig for at få alt gjort uden nogen komplikationer på GUI, har du måske bemærket, hvordan GitHub begyndte at bruge deres knap så nye værktøj kaldet "gh". Jeg besluttede at give det et skud, for det så trods alt lovende ud. Og jeg kunne personligt godt lide det - så meget, at jeg ville lave en artikel om det!

Før vi begynder, skal jeg dog forklare flere udtryk, jeg vil bruge i denne artikel.

"GH" står for "GitHub”. Det er også her værktøjets navn stammer fra, så det kan ikke forveksles med Git selv. For at forklare, hvad det gør generelt, kan du oprette, fordele, slette, gennemse repos; oprette pull-anmodninger; og mange flere. I tilfælde af at du ikke kan finde en funktion, men heller ikke ønsker at forlade terminalen, giver den også en tekstbaseret browser, så du kan gennemse sider i GitHub.

"CLI" står for "Command Line Ingrænseflade". Denne terminal (eller i Windows, kommandoprompt) er en af ​​dem. Hvis der er tilføjet et "CLI" ud for et appnavn ("Git CLI" for denne artikel), betyder det, at appen kun kører gennem terminalen. Og "Git CLI" i denne sammenhæng er vel den Git, vi kender. Ligesom kommandoen vi laver commits eller rebaser med.

GUI står for "Graphisk Use Interface", og det er grænsefladen, vi "navigerer" på. Bedre sagt, et skrivebordsmiljø er generelt en GUI.

En "API-nøgle" er en slags hemmelig streng/fil, du bruger til at godkende til tjenester. Pas på, at den omgår 2-faktor-godkendelse og så videre, når du godkender med den. Så sørg for at opbevare dem sikkert og et sted, der er uden for rækkevidde på andre måder.

Først og fremmest, hvad er dette værktøj? Hvordan håndterer det operationer, vi ville udføre gennem Git CLI?

"gh" kan betragtes som en open source (Source Code) wrapper ved at bruge selve Git CLI og GitHub API'er til at få tingene gjort. Faktisk kan du endda sende parametre til de Git-kommandoer, den bruger! Dem kommer jeg ind på senere.

Installation og opsætning

Husk, at jeg gennemgår installationen vha Termux. Men proceduren burde være stort set den samme, som du kunne have på en Debian-baseret distro – Ubuntu har det for eksempel på deres officielle repos. Til Windows har du vel brug for enten CygWin eller WSL. ¯\_(ツ)_/¯

# Lad os først installere værktøjet. Installerer også Git, da det er backend # for gh. $ pkg install git gh -y # Så før alt, skal vi godkende. Dette vil gemme en # ny API-nøgle i værktøjets database, så du ikke behøver at godkende # igen. Hvis du allerede har indstillet GITHUB_TOKEN, vil dette ikke virke, så deaktiver # det først. :) $ gh auth login

Nu, før vi fortsætter her, skal jeg påpege flere ting.

  • For det første, vælg ikke "GitHub Enterprise Server" hvis du ikke har en form for selv-hostet GitHub.
  • For det andet, brug SSH i stedet for HTTPS, hvis du har tilføjet din offentlige nøgle til din GitHub-konto. I tilfælde af at du mister API-nøglen, mister du i det mindste ikke din SSH-nøgle, så det kan også være en god reservemetode.
  • For det tredje skal du vælge at logge ind med browseren kun hvis du ikke har en API-nøgle ved hånden! Virkelig, det ville ikke give mening at have en anden nøgle, mens du allerede har en.

Når du er færdig med at sætte tingene op, lad os fortælle Git CLI om det.

$ gh auth setup-git

Dette vil lave de nødvendige Git CLI-konfigurationer, hvis dine reflekser trænger ind og får dig til at bruge Git i stedet for GH.

Nogle grundlæggende kommandoer

Nu hvor du har konfigureret GH, så lad mig lære dig flere grundlæggende kommandoer på en historiebasis.

Først og fremmest, lad os sige, at du vil oprette en pull-anmodning til min lokale manifest-repo. Du vil give det først.

$ gh repo gaffel windowz414/platform_manifest! windowsz414/platform_manifest eksisterer allerede? Kunne du tænke dig at klone gaflen? Ja Kloning ind i 'platform_manifest'... fjernbetjening: Optælling af objekter: 136, udført. fjernbetjening: Optælling af objekter: 100% (136/136), udført. fjernbetjening: Komprimering af objekter: 100% (81/81), færdig. fjernbetjening: I alt 136 (delta 46), genbrugt 89 (delta 12), pakke-genbrugt 0 Modtagende objekter: 100% (136/136), 30.70 KiB | 166.00 KiB/s, udført. Løsning af deltaer: 100% (46/46), udført. Opdatering upstream Fra github.com:windowz414/platform_manifest * [ny gren] amyrom/rosie -> upstream/amyrom/rosie * [ny gren] aosp-eleven -> upstream/aosp-eleven * [ny gren] aosp-ten -> upstream/aosp-ten * [ny gren] pil-11.0 -> opstrøms/pil-11.0 * [ny gren] cm-14.1 -> opstrøms/cm-14.1 * [ny gren] dot11 -> opstrøms/dot11 * [ny gren ] e/os/v1-nougat -> upstream/e/os/v1-nougat * [ny gren] fluid-11 -> upstream/fluid-11 * [ny gren] fox_7.1 -> upstream/fox_7.1 * [ny gren] hentai-rika -> upstream/hentai-rika * [ny gren] ion-pie -> upstream/ion-pie * [ny gren] lineage-15.1 -> upstream/lineage-15.1 * [new branch] lineage -17.1 -> upstream/lineage-17.1 * [new branch] lineage-18.1 -> upstream/lineage-18.1 * [new branch] lineage-18.1_teos -> upstream/lineage-18.1_teos * [new branch] lineage-19.0 - > upstream/lineage-19.0 * [new branch] main -> upstream/main * [new branch] mkn-mr1 -> upstream/mkn-mr1 * [new branch] revengeos-r11.0 -> upstream/revengeos-r11.0. 1 * [ny gren] stellar-S1 -> opstrøms/stellar-S11 * [ny gren] teos-n -> opstrøms/teos-n * [ny gren] weebprojekt-11 -> opstrøms/weebprojekt-XNUMX ✓ Klonet gaffel

Lad os så sige, at du har en separat organisation for dine eksperimenter kaldet "wz414-labs", at du ikke har forgrenet din personlige profil endnu og vil klone der, så åbn pull-anmodning der igennem i stedet. Du vil også klone "cm-14.1"-grenen, så du ikke behøver at lave git-checkout til den igen.

$ gh repo gaffel windowz414/platform_manifest --org="wz414-labs" -- --branch="cm-14.1" ✓ Oprettet gaffel wz414-labs/platform_manifest ? Kunne du tænke dig at klone gaflen? Ja Kloning ind i 'platform_manifest'... fjernbetjening: Optælling af objekter: 136, udført. fjernbetjening: Optælling af objekter: 100% (136/136), udført. fjernbetjening: Komprimering af objekter: 100% (81/81), færdig. fjernbetjening: I alt 136 (delta 46), genbrugt 89 (delta 12), pakke-genbrugt 0 Modtagende objekter: 100% (136/136), 30.70 KiB | 120.00 KiB/s, udført. Løsning af deltaer: 100% (46/46), udført. Opdatering upstream Fra github.com:windowz414/platform_manifest * [ny gren] amyrom/rosie -> upstream/amyrom/rosie * [ny gren] aosp-eleven -> upstream/aosp-eleven * [ny gren] aosp-ten -> upstream/aosp-ten * [ny gren] pil-11.0 -> opstrøms/pil-11.0 * [ny gren] cm-14.1 -> opstrøms/cm-14.1 * [ny gren] dot11 -> opstrøms/dot11 * [ny gren ] e/os/v1-nougat -> upstream/e/os/v1-nougat * [ny gren] fluid-11 -> upstream/fluid-11 * [ny gren] fox_7.1 -> upstream/fox_7.1 * [ny gren] hentai-rika -> upstream/hentai-rika * [ny gren] ion-pie -> upstream/ion-pie * [ny gren] lineage-15.1 -> upstream/lineage-15.1 * [new branch] lineage -17.1 -> upstream/lineage-17.1 * [new branch] lineage-18.1 -> upstream/lineage-18.1 * [new branch] lineage-18.1_teos -> upstream/lineage-18.1_teos * [new branch] lineage-19.0 - > upstream/lineage-19.0 * [new branch] main -> upstream/main * [new branch] mkn-mr1 -> upstream/mkn-mr1 * [new branch] revengeos-r11.0 -> upstream/revengeos-r11.0. 1 * [ny gren] stellar-S1 -> opstrøms/stellar-S11 * [ny gren] teos-n -> opstrøms/teos-n * [ny gren] weebprojekt-11 -> opstrøms/weebprojekt-XNUMX ✓ Klonet gaffel

Du kan se, at jeg ikke brugte "-b cm-14.1" og lavede det lange argument i stedet for. Fra datoen for denne artikel, den 16. februar 2022, har GH en fejl om, at den ikke sender korte argumenter til Git CLI korrekt, og derfor skal det gøres som lange argumenter i stedet.

Når det er gjort, gik du regelmæssigt ind i mappen, foretog dine ændringer, forpligtede og skubbede den og er klar til at udføre pull-anmodning. Til dette er alt hvad du behøver en simpel

$ gh pr create --branch="cm-14.1" Opretter pull request for wz414-labs:cm-14.1 til cm-14.1 i windowz414/platform_manifest ? Title teos: Skift til Git-Polycule ? Legeme ? Hvad er det næste? Indsend https://github.com/windowz414/platform_manifest/pull/1

Hvis du ikke tilføjer “–branch=cm-14.1”, ville du skabe PR mod “hoved” gren, hvilket selvfølgelig vil give problemer, når det ikke bliver håndteret rigtigt.

Og nu er jeg nødt til at fusionere denne PR, ikke? Så jeg kloner først repo'en, checker ud til den tildelte filial og lister PR'er først.

# Kloning først. $ git clone https://github.com/windowz414/platform_manifest Kloning ind i 'platform_manifest'... fjernbetjening: Optælling af objekter: 136, udført. fjernbetjening: Optælling af objekter: 100% (136/136), udført. fjernbetjening: Komprimering af objekter: 100% (81/81), færdig. fjernbetjening: I alt 136 (delta 46), genbrugt 89 (delta 12), pakke-genbrugt 0 Modtagende objekter: 100% (136/136), 30.70 KiB | 137.00 KiB/s, udført. Løsning af deltaer: 100% (46/46), udført. # Så tjekker du ud til filialen. $ git checkout cm-14.1 branch 'cm-14.1' sat op til at spore 'origin/cm-14.1'. Skiftet til en ny filial 'cm-14.1' # Og nu opremser PR'er. $ gh pr liste Viser 1 af 1 åben pull-anmodning i windowz414/platform_manifest #1 teos: Skift til Git-Polycule wz414-labs:cm-14.1

Nu hvor vi ser, at der er en PR for at ændre fjernbetjeningen til "Git-Polycule", lad os se, hvad der har ændret sig med den.

$ gh pr diff 1 diff --git a/teos.xml b/teos.xml index b145fc0..3aadeb6 100644 --- a/teos.xml +++ b/teos.xml @@ -2,7 +2,7, 414 @@ 

Virker lovende! Tid til at fusionere!

$ gh pr fletning 1 ? Hvilken flettemetode vil du gerne bruge? Rebase og flette? Hvad er det næste? Send ✓ Genbaseret og fusioneret pull-anmodning #1 (teos: Skift til Git-Polycule)

Nu hvor jeg har slået det sammen, kan du slette din gaffel.

$ gh repo slet --bekræft wz414-labs/platform_manifest ✓ Slettet repository wz414-labs/platform_manifest

Du kan se, at det med det samme slettede repoen uden bekræftelsesanmodning, fordi jeg sendte parameteren "–bekræft" der. Hvis du ikke ville bestå det, ville du få dette:

$ gh repo slette windowsz414/systemd? Skriv windowz414/systemd for at bekræfte sletningen:

Og du skal skrive hele reponavnet. Spild af tid…

Resumé

Kort sagt er `gh` en ret forenklet Git CLI/Curl wrapper, der forener simple Git-operationer og GitHub API-ting under samme tag. Hvordan bruger du det? Ser det lovende ud for dig, ligesom det gør for mig? Ser frem til at høre fra dig!

Relaterede artikler