Close

Pull request Git Fetch: competenza sbloccata

Primo piano di Nicola Paolucci
Nicola Paolucci

Developer Advocate


Oggi, applicare una correzione a un progetto è facile: basta creare un fork (che fa apparire per magia una copia remota completa del progetto su cui lavorare), selezionare il file da modificare, premere Modifica ed eseguire il commit delle correzioni.

E se invece fossimo i destinatari di una pull request (abbreviato in PR di seguito)? Un'elegante interfaccia utente web è spesso tutto ciò che serve. Basta cliccare su un pulsante per approvare, su un altro per eseguire il merge e il gioco è fatto.

Ma non è sempre così. È comune dover scaricare localmente le modifiche incluse in una pull request (PR), eseguire alcuni test e vedere come appaiono nello strumento IDE per dare un senso alle operazioni eseguite.

I passaggi scaricare, ovvero eseguire i comandi fetch e checkout, le pull request dei colleghi o dei collaboratori sono concettualmente semplici, ma lo diventano ancora di più se si conoscono alcuni dettagli e suggerimenti importanti.

Di seguito descriverò i servizi a riga di comando offerti da git per gestire le pull request dalla riga di comando con facilità.

Prima di iniziare: arricchisci il prompt della shell con il nome e lo stato del branch


Resto sempre molto sorpreso da quante persone abbiano un prompt dei comandi semplice in cui non è mostrato il branch git attivo o se sono presenti file modificati o di cui non è stato eseguito il commit nella directory di lavoro. Se ti ritrovi in questa descrizione, permettimi di aiutarti e sorprenderti allo stesso tempo!

Installa uno strumento simile al fantastico Liquid Prompt, in grado di fornire ottime annotazioni sullo stato della directory di lavoro git (e di supportare anche qualsiasi altro VCS):

(Nella screenshot qui sopra vedi il messaggio del prompt che mi avvisa che mi trovo nel branch newbranch, che ho aggiunto 5 righe ai file che monitoro nella directory di lavoro e che ne ho rimosse 0)

Logo Git
materiale correlato

Installa Git

Logo di Bitbucket
Scopri la soluzione

Impara a utilizzare Git con Bitbucket Cloud

Per chi lavora nello stesso repository


Se lavori nello stesso repository del team, il processo di estrazione di una pull request è molto semplice: basta eseguire i comandi fetch e checkout per il branch da cui è stata creata la pull request:

  • Ottieni tutti i branch pubblicati nel repository condiviso:
git fetch origin
  • Crea un branch locale che tenga traccia del branch remoto che ti interessa:
git checkout -b PRJ-1234 origin/PRJ-1234
  • Ora puoi eseguire i comandi diff, merge e procedere ai test:
git diff main ./run-tests.sh
  • Quando tutto è come desideri, torna all'interfaccia utente web e lascia un feedback o approva la modifica a titolo definitivo.

Collaboratori che lavorano sui propri fork


Il processo cambia leggermente quando alcuni dei collaboratori lavorano su fork separati. In questo caso, puoi eseguire il comando fetch per il branch remoto in cui è stato eseguito il commit del contributo o della funzione:

  • Aggiungi prima il repository remoto del collaboratore:
git remote add jsmith http://bitbucket.org/jsmith/coolproject.git
  • Raccogli tutti gli ultimi aggiornamenti da origin, il repository principale:
git checkout main git fetch origin git merge main
  • Ottieni tutti i branch pubblicati sul fork del collaboratore:
git fetch jsmith
  • Crea un branch locale che tenga traccia del branch remoto che ti interessa:
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234
  • Ora puoi eseguire i comandi diff, merge e procedere ai test:
git diff main ./run-tests.sh

Ridurre il lavoro utilizzando i riferimenti delle pull request


I processi illustrati sopra sono molto utili, ma potrebbero verificarsi diversi problemi:

  • Cosa fare se ci sono molti collaboratori, ognuno con i propri fork? Aggiungere tutti i fork e gestirli separatamente diventa poco pratico.
  • Cosa fare se non si dispone nemmeno dell'accesso ad alcuni fork e non è possibile estrarre il branch di origine?

La soluzione a entrambi questi ticket consiste nell'usare i riferimenti delle richieste pull forniti da alcuni server Git. La procedura che mostrerò è supportata da alcuni server Git e varia leggermente a seconda di quello in uso. Di seguito spiegherò come recuperare tutte le richieste pull su Stash (ora chiamato Bitbucket Data Center) e Github.

Non aver paura delle specifiche di riferimento

Il primo prerequisito è acquisire familiarità con le specifiche di riferimento: sono elementi utili che non devono metterti in soggezione. Si tratta di semplici mappature dai branch remoti ai riferimenti locali, in altre parole un modo semplice per comunicare a git che un determinato branch remoto (o set di branch remoti) deve essere mappato in locale a determinati nomi, in un determinato spazio dei nomi.

Ad esempio un comando come:

git fetch +refs/heads/main:refs/remotes/origin/main

mapperà il branch remoto main nel repository origin remoto a un repository origin/main locale in modo che tu possa digitare:

git checkout origin/main

e fare comunque riferimento a quel determinato branch remoto. Il segno più (+) nella definizione indica che vogliamo che git aggiorni il riferimento anche se non si tratta di un'operazione con avanzamento rapido.

Il modo in cui usiamo questo comando per scaricare tutte le pull request consiste nel mappare il modo in cui il repository remoto archivia gli HEADS delle pull request e nel mapparli a uno spazio dei nomi locale per consultarli con facilità.

Quindi, a condizione che tu abbia definito un repository origin (o upstream) remoto, ecco cosa fare.

Nota: come giustamente osservato da diversi sviluppatori di Stash (ora chiamato Bitbucket Data Center), i riferimenti che mostrerò di seguito sono considerati non documentati e privati e potrebbero cambiare in qualsiasi momento.

Download di tutte le pull request: Stash

  • Esegui un fork di un repository.
  • Clona il fork localmente:
git clone git@stash.atlassian.com:durdn/tis.git
  • Aggiungi il repository originale upstream come upstream.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.git
  • Ottieni gli heads più recenti dal manutentore "upstream"
git fetch upstream
  • Aggiungi i refspec che mapperanno gli heads delle pull request remoti a uno spazio dei nomi pr locale. Puoi farlo utilizzando un comando config:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
  • Se guardi in .git/config, le voci del comando fetch diventano:
[remote "upstream"]
    url = git@stash.atlassian.com:docker/libswarm.git
    fetch = +refs/heads/*:refs/remotes/upstream/*
    fetch = +refs/pull-requests/*/from:refs/remotes/upstream/pr/*
  • Ora puoi recuperare con facilità tutti i branch delle pull request eseguendo il comando fetch:
$ git fetch upstream

remote: Counting objects: 417, done.
remote: Compressing objects: 100% (274/274), done.
remote: Total 417 (delta 226), reused 277 (delta 128)
Receiving objects: 100% (417/417), 105.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (226/226), done.

From stash.atlassian.com:docker/libswarm
 * [new ref]         refs/pull-requests/10/from-> upstream/pr/10
 [...]
 * [new ref]         refs/pull-requests/100/from -> upstream/pr/100
 * [new ref]         refs/pull-requests/101/from -> upstream/pr/101
 [...]
 * [new ref]         refs/pull-requests/109/from -> upstream/pr/109
 * [new ref]         refs/pull-requests/110/from -> upstream/pr/110
 [...]
  • Ora, per passare a una determinata pull request, puoi semplicemente eseguire:
git checkout pr/102

Download di tutte le pull request: Github

Se i fork o gli upstream si trovano su Github, il processo è lo stesso di quello illustrato sopra, ma il comando config cambia in:

 git config --add remote.origin.fetch '+refs/pull//head:refs/remotes/origin/pr/'

E il repository remoto in .git/config cambierà in modo da includere una configurazione di fetch aggiuntiva per mappare gli heads della pull request a uno spazio dei nomi locale chiamato pr:

[remote "upstream"] url = git@github.com:docker/libswarm.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*

Recuperare una singola pull request tramite i riferimenti

Se non vuoi configurare le voci del comando fetch in .git/config e desideri solo accedere rapidamente a una pull request, serve un solo comando:

  • Estrai una singola pull request in Stash:
git fetch refs/pull-requests/your-pr-number/from:local-branch-name
  • Estrai una singola pull request in Github:
git fetch refs/pull/your-pr-number/head:local-branch-name

E se ti accorgi di usare spesso questo processo, puoi semplificarlo creando un alias git:

# For Stash
git config alias.spr '!sh -c "git fetch origin pull-requests/${1}/from:pr/${1}" -'

# For Github
git config alias.gpr '!sh -c "git fetch origin pull/${1}/head:pr/${1}" -'

Tramite questo alias configurato è possibile recuperare una pull request con un semplice comando (grazie a inuit):

Conclusione


Tenere sotto controllo il lavoro dei tuoi colleghi o collaboratori è facile dopo aver creato un paio di semplici alias o aver aggiunto le specifiche di riferimento appropriate a .git/config.

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


Condividi l'articolo

Letture consigliate

Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up