GNU/Linux >> Linux Esercitazione >  >> Linux

Controlla se il repository git locale è avanti/dietro il telecomando

Da questa risposta.

  1. Esegui un recupero:git fetch .
  2. Ottieni quanti commit è presente nel branch corrente:behind_count = $(git rev-list --count [email protected]{u}) .
  3. Ottieni quanti commit current branch sono avanti:ahead_count = $(git rev-list --count @{u}..HEAD) . (Presuppone che il punto da cui prendi sia il punto in cui spingi, vedi push.default opzione di configurazione).
  4. Se entrambi behind_count e ahead_count sono 0, allora il ramo corrente è aggiornato.
  5. Se behind_count è 0 e ahead_count è maggiore di 0, allora il ramo corrente è avanti.
  6. Se behind_count è maggiore di 0 e ahead_count è 0, allora il ramo corrente è in ritardo.
  7. Se entrambi behind_count e ahead_count sono maggiori di 0, allora il ramo corrente è divergente.

Spiegazione:

  • git rev-list elenca tutti i commit di dare un intervallo di commit. --count option output quanti commit sarebbero stati elencati e sopprimere tutti gli altri output.
  • HEAD nomina il ramo corrente.
  • @{u} si riferisce all'upstream locale del ramo corrente (configurato con branch.<name>.remote e branch.<name>.merge ). C'è anche @{push} , di solito indica lo stesso di @{u} .
  • <rev1>..<rev2> specifica l'intervallo di commit che include i commit raggiungibili da ma esclude quelli raggiungibili da . Quando o viene omesso, il valore predefinito è HEAD.

Puoi farlo con una combinazione di git merge-base e git rev-parse . Se git merge-base <branch> <remote branch> restituisce lo stesso di git rev-parse <remote branch> , allora la tua filiale locale è avanti. Se restituisce lo stesso di git rev-parse <branch> , allora la tua filiale locale è in ritardo. Se merge-base restituisce una risposta diversa rispetto a rev-parse , quindi i rami si sono separati e dovrai eseguire un'unione.

Sarebbe meglio fare un git fetch prima di controllare i rami, però, altrimenti la tua determinazione se devi o meno tirare sarà obsoleta. Dovrai anche verificare che ogni ramo che controlli abbia un ramo di tracciamento remoto. Puoi usare git for-each-ref --format='%(upstream:short)' refs/heads/<branch> fare quello. Quel comando restituirà il ramo di tracciamento remoto di <branch> o la stringa vuota se non ne ha una. Da qualche parte su SO c'è una versione diversa che restituirà un errore se il ramo non ha un ramo di tracciamento remoto, che potrebbe essere più utile per il tuo scopo.


Alla fine, l'ho implementato nel mio plugin git-ws C++11.

string currentBranch = run("git rev-parse --abbrev-ref HEAD"); 
bool canCommit = run("git diff-index --name-only --ignore-submodules HEAD --").empty();
bool canPush = stoi(run("git rev-list HEAD...origin/" + currentBranch + " --ignore-submodules --count")[0]) > 0;

Sembra funzionare finora. canPull deve ancora essere testato e implementato.

Spiegazione:

  • currentBranch ottiene l'output della console, che è una stringa del nome del ramo corrente
  • canCommit ottiene se la console emette qualcosa (differenza tra le modifiche correnti e HEAD, ignorando i sottomoduli)
  • canPush ottiene il conteggio delle modifiche tra origin/currentBranch e il repository locale - se > 0 , il repository locale può essere inviato

Per riferimenti futuri. A partire da Git v2.17.0

git status -sb

contiene la parola dietro .In modo che possa essere utilizzato direttamente per verificare la presenza di tiri.

Nota:ricorda di eseguire git fetch prima di eseguire git status -sb


Linux
  1. Come rinominare Git Branch locale e remoto

  2. Migra i repository tra le istanze di Gitlab

  3. Aggiunta di repository Git e branch alla riga di stato di Tmux

  4. iptables reindirizza le connessioni locali al sistema/porta remoto

  5. Controlla il certificato remoto - MySQL

Come configurare un repository Git remoto su Debian 11

Lsyncd:sincronizza le directory locali con Linux remoto

alternativa all'abbonamento redhat | Repo locale

Come rimuovere il repository remoto Git

Come clonare un repository Git con Ansible

Come configurare e gestire un repository Git remoto su Linux