Statut Git sur tous les repo

quels outils, le cas échéant, sont disponibles pour montrer l'état de mes prises en pension git et combien ils sont en avant/en arrière par rapport à leurs télécommandes? J'imagine que quelque chose comme ça existe:

repo1 +2 <--> remote1
repo1    <--> remote1 +3
repo2    <--> remote +10

la première ligne indique que repo1 est en avance de 2 commits, la deuxième que remote2 est en avance de 3 commits, la troisième que remote of repo2 est en avance de 10 commits.

5
demandé sur Ruud Poutsma 2013-09-12 11:18:02

4 réponses

Je ne suis pas tout à fait sûr de ce que cela signifie de dire qu'un repo est devant ou derrière un autre repo. Ce ne sont que des décors, et sans aucune sorte de référence, il n'y a pas d'ordre. On peut dire que le repo local s'engage que le remote one ne s'engage pas. Mais on ne peut pas dire s'il est devant ou derrière sans parler des branches. Vous pourriez être en mesure de dire si une pension est à jour ou pas.

aussi, lors de la communication avec une télécommande, le client git local n'a aucune idée du nombre de propagations qui se trouvent entre la pointe de la branche locale et la pointe distante. Il ne le saura pas tant que les données n'auront pas été transférées localement.

ce que vous pouvez faire à la place, c'est lancer git fetch --all , et avoir un script comme celui-ci (je l'ai appelé `git-repo-status Local):

#!/bin/bash

# Taken from http://stackoverflow.com/questions/620650/can-i-easily-update-all-local-git-branches-from-remote-branches-simultaneously/answer-9076361
# tweaked by me to help give status of local versus upstream branches.
main() {
  REMOTES="$@";
  if [ -z "$REMOTES" ]; then
    REMOTES=$(git remote);
  fi
  REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
  echo "$REMOTES" | while read REMOTE; do
    git remote show $REMOTE -n \
    | awk '/merges with remote/{print " "}' \
    | while read line; do
      RB=$(echo "$line"|cut -f1 -d" ");
      ARB="refs/remotes/$REMOTE/$RB";
      LB=$(echo "$line"|cut -f2 -d" ");
      ALB="refs/heads/$LB";

      # This is in reference to the local branch.
      NBEHIND=$(( $(git rev-list --count $ALB..$ARB 2>/dev/null) +0));
      NAHEAD=$(( $(git rev-list --count $ARB..$ALB 2>/dev/null) +0));

      if [ "$NBEHIND" -gt 0 -a "$NAHEAD" -gt 0 ]; then
        echo "$LB <--> $REMOTE/$RB: -$NBEHIND +$NAHEAD";
      elif [ "$NBEHIND" -gt 0 ]; then
        echo "$LB <--> $REMOTE/$RB: -$NBEHIND";
      elif [ "$NAHEAD" -gt 0 ]; then
        echo "$LB <--> $REMOTE/$RB: +$NAHEAD";
      fi
    done
  done
}

main $@

il produit quelque chose comme:

:: git repo-status
master <--> upstream/master: -14

je me rends compte que ce n'est pas une réponse directe à votre problème, mais je ne pense pas que ce que vous voulez est possible sans exécuter git fetch --all et saisir les révisions en amont. Si vous êtes prêt à le faire, alors ce qui précède peut vous être utile.

3
répondu John Szakmeister 2013-09-12 09:44:44

vous pouvez trouver plusieurs scripts, tous basés sur la recherche de .git dossier:

le premier peut être adapté pour afficher le type de statut que vous recherchez:

#!/bin/bash

# usage: "151900920" source_dir [source_dir] ...
# where source_dir args are directories containing git repositories

red="3[00;31m"
green="3[00;32m"
yellow="3[00;33m"
blue="3[00;34m"
purple="3[00;35m"
cyan="3[00;36m"

reset="3[00m"


if [ $# -eq 0 ] ; then
  ARGS=( "foldername" "foldername/subfoldername" )
else
  ARGS=$@
fi

for i in ${ARGS[@]} ; do
  for gitdir in `find $i -name .git` ; do
    ( working=$(dirname $gitdir)
      cd $working
      RES=$(git status | grep -E '^# (Changes|Untracked|Your branch)')
      STAT=""
      grep -e 'Untracked' <<<${RES} >/dev/null 2>&1
      if [ $? -eq 0 ] ; then
        STAT=" $red[Untracked]$reset"
      fi
      grep -e 'Changes not staged for commit' <<<${RES} >/dev/null 2>&1
      if [ $? -eq 0 ] ; then
        STAT="$STAT $red[Modified]$reset"
      fi
      grep -e 'Changes to be committed' <<<${RES} >/dev/null 2>&1
      if [ $? -eq 0 ] ; then
        STAT="$STAT $green[Staged]$reset"
      fi
      grep -e 'Your branch is ahead' <<<${RES} >/dev/null 2>&1
      if [ $? -eq 0 ] ; then
        STAT="$STAT $yellow[Unpushed]$reset"
      fi
      grep -e 'Your branch is behind' <<<${RES} >/dev/null 2>&1
      if [ $? -eq 0 ] ; then
        STAT="$STAT $cyan[Unmerged]$reset"
      fi

      if [ -n "$STAT" ] ; then
        echo -e "$working :$STAT"
      fi
    )
  done
done
2
répondu VonC 2017-05-23 11:33:17

je suis conscient que cette question n'est plus si nouvelle, mais j'ai écrit un outil open-source pour exactement cette raison: il trouve des dépôts git locaux et suit leur état montrant la branche actuelle et une chaîne d'État pour tous vos dépôts locaux dans un seul endroit.

cela en fait un point de départ idéal pour tous vos tâches de développement (git) aussi bien.

enter image description here

(il y a aussi une version mac mais elle a encore quelques problèmes en raison des restrictions D'accès aux fichiers sur Mac OSX - quelques TODOs ici)

si vous utilisez Windows, vous pourriez profiter d'un effet supplémentaire:

parce qu'avec git vous n'avez généralement pas de dossiers de branche comme MyTool\trunk\... ou MyTool\v2.0\... vous ne pouvez pas voir dans quelle branche vous travaillez activement en utilisant L'Explorateur de fichiers Windows.

donc la chose cool au sujet de cet outil est que pendant l'exécution, il améliorera automatiquement toutes les fenêtres D'Explorateur de fichiers en ajoutant la branche courante et la chaîne de statut du dépôt ouvert dans la fenêtre D'Explorateur de fichiers (le cas échéant).

enter image description here

c'est ouvert à 100% source, donc s'il vous plaît donnez-le un essai et je serais très heureux si vous vous sentez à l'aise pour contribuer.

mise à Jour

RepoZ vient maintenant avec une amélioration de ligne de commande appelée grr qui fait usage des informations agrégées de dépôt de RepoZ pour afficher des données en direct dans la ligne de commande plus la possibilité de sauter du dépôt au dépôt avec la commande cd grr cd RepoZ

"

enter image description here

1
répondu Waescher 2017-09-27 14:22:36

quick one-liner qui suppose que vous êtes dans un dossier contenant beaucoup de dossiers git repo:

find . -maxdepth 1 -type d -exec sh -c "(cd '{}' && pwd &&  git status)" \;
0
répondu Tim Abell 2015-08-27 12:24:25