【问题标题】:Git status over all repo's所有 repo 的 Git 状态
【发布时间】:2013-09-16 11:03:27
【问题描述】:

有哪些工具(如果有的话)可用于显示我的 git 存储库的状态,以及它们相对于遥控器的前进/后退程度?我想像这样的东西存在:

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

第一行显示 repo1 领先 2 次提交,第二行显示 remote2 领先 3 次提交,第三行显示 repo2 仅远程领先 10 次提交。

【问题讨论】:

    标签: git status


    【解决方案1】:

    我不完全确定说一个回购领先或落后于另一个回购意味着什么。它们只是集合,没有任何参考,没有排序。你可以说本地仓库有远程仓库没有的提交。但是你不能不说分支就说它是领先还是落后。不过,您也许可以说出一个 repo 是否是最新的。

    此外,当与远程通信时,本地 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 并从上游获取修订版,您想要什么是可能的。如果您愿意这样做,那么以上内容可能对您有用。

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 我不认为它完全回答了这个问题(这不提供远程仓库之前或之后的提交数量)。此外,这不会获取遥控器,因此报告的状态可能会产生误导——遥控器可能包含本地不存在的数据。它要求您与遥控器保持同步……我认为您至少应该提及这一点。尽管如此,参考文献+1。很高兴知道这些。
      • @jszakmeister 我同意。为您的脚本 +1。它是“已接受答案”状态的良好候选者:)
      【解决方案3】:

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

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

      如果您使用的是 Windows,您可能会享受到额外的效果:

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

      因此,该工具最酷的地方在于,在运行时,它会通过添加当前分支和在文件资源管理器窗口中打开的存储库的状态字符串(如果有)来自动增强所有文件资源管理器窗口。

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

      更新

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

      【讨论】:

        【解决方案4】:

        假设您在一个包含大量 git repo 文件夹的文件夹中的快速单线:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 2016-01-09
          • 2023-01-04
          相关资源
          最近更新 更多