所有回购的Git状态

时间:2013-09-12 07:18:03

标签: git status

有哪些工具可用于显示我的git repo的状态以及它们与遥控器相比前进/后退的程度?我想象存在这样的东西:

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

第一行显示repo1提前2次提交,第二次显示remote2提前3次提交,第三次显示只有repo2的远程提前10次提交。

4 个答案:

答案 0 :(得分:3)

我不完全确定说一个回购在另一个回购的前面或后面是什么意思。它们只是集合,没有任何参考,没有排序。你可以说本地仓库已经提交了遥控器没有的东西。但是如果不谈论分支机构,你不能说它是先行还是落后。你或许可以说一个回购是否是最新的。

此外,在与远程通信时,本地git客户端不知道本地分支提示和远程提交之间有多少提交。在数据本地传输之前,它不会知道。

你可以做什么,运行git fetch --all,并有一个像这样的脚本(我在本地称它为“git-repo-status”):

#!/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 $5" "$1}' \
    | 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 $@

运行它会产生类似:

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

我意识到这不是你问题的直接答案,但我不认为如果不运行git fetch --all并从上游获取修订版,你想要的是什么。如果您愿意这样做,那么以上内容可能对您有用。

答案 1 :(得分:2)

您可以找到几个脚本,所有脚本都基于查找.git文件夹:

第一个可以适应显示您所追求的状态:

#!/bin/bash

# usage: $0 source_dir [source_dir] ...
# where source_dir args are directories containing git repositories

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

reset="\033[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 :(得分:1)

我知道这个问题不再那么新鲜,但我已经编写了一个开源工具,正是出于这个原因:它找到了本地git存储库并跟踪它们显示当前分支和状态字符串的状态在一个地方为您所有的本地存储库。

这使它成为所有(git)开发任务的完美起点。

RepoZ

(还有一个mac版本,但由于Mac OSX上的文件访问限制,它仍然有一些问题 - 这里有一些TODO)

如果您使用的是Windows,则可能会受到额外的影响:

因为使用git,您通常没有像MyTool\trunk\...MyTool\v2.0\...这样的专用分支文件夹,在使用Windows文件资源管理器时,您无法看到您正在使用哪个分支。

关于该工具的一个很酷的事情是,在运行时,它会自动增强所有文件资源管理器窗口,方法是添加当前分支和在文件资源管理器窗口中打开的存储库的状态字符串(如果有的话)。

enter image description here

这是100%的开源,所以请试一试,如果您愿意做出贡献,我会非常高兴。

更新

RepoZ现在附带一个名为 grr 的命令行增强功能,它利用来自RepoZ的聚合存储库信息在命令行中显示实时数据加上跳转的可能性使用cd命令从存储库到存储库:grr cd RepoZ

enter image description here

答案 3 :(得分:0)

快速单行,假设您在包含大量git repo文件夹的文件夹中:

find . -maxdepth 1 -type d -exec sh -c "(cd '{}' && pwd &&  git status)" \;