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.
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.
vous pouvez trouver plusieurs scripts, tous basés sur la recherche de .git
dossier:
- git-multi-status.sh
-
find-dirty.sh
- GitStatus (python)
- autres options, comme suggéré dans " État Git à travers plusieurs dépôts sur un Mac
- ...
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
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.
(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).
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
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)" \;