7

私のgitリポジトリのステータスと、それらがリモートに対してどれだけ進んでいるか遅れているかを表示するために利用できるツールはありますか? 私はこのようなものが存在すると想像しています:

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

最初の行は repo1 が 2 コミット進んでいることを示し、2 番目は remote2 が 3 コミット進んでいることを示し、3 番目は repo2 のリモートのみが 10 コミット進んでいることを示しています。

4

4 に答える 4

3

.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
于 2013-09-12T09:31:49.707 に答える
3

あるレポが別のレポの前または後ろにあると言うことが何を意味するのか完全にはわかりません。それらは単なるセットであり、何の参照もなければ、順序付けもありません。ローカル リポジトリにはリモート リポジトリにはないコミットがあると言えます。しかし、枝の話をしなければ、それが進んでいるか遅れているかはわかりません。ただし、レポが最新かどうかを判断できる場合があります。

また、リモートと通信する場合、ローカル git クライアントは、ローカル ブランチ チップとリモート ブランチ チップの間にいくつのコミットがあるかわかりません。データがローカルに転送されるまで、それはわかりません。

代わりにできることは、 rungit 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あなたの問題に対する直接的な答えではないことは承知していますが、アップストリームからリビジョンを実行して取得しない限り、あなたが望むことは不可能だと思います. あなたがそれを喜んで行うなら、上記はあなたにとって役立つかもしれません。

于 2013-09-12T09:44:44.187 に答える
0

多くの git repo フォルダーを含むフォルダーにいることを前提とした簡単なワンライナー:

find . -maxdepth 1 -type d -exec sh -c "(cd '{}' && pwd &&  git status)" \;
于 2015-08-27T12:24:25.520 に答える