有哪些工具(如果有)可用于显示我的 git 存储库的状态以及它们相对于远程的前进/后退多少?我想象这样的事情存在:
repo1 +2 <--> remote1
repo1 <--> remote1 +3
repo2 <--> remote +10
第一行显示 repo1 领先 2 次提交,第二行显示 remote2 领先 3 次提交,第三行仅显示 repo2 的远程领先 10 次提交。
您可以找到几个脚本,所有这些都基于查找.git
文件夹:
find-dirty.sh
第一个可以调整以显示您所追求的状态:
#!/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
我不完全确定说一个回购领先或落后于另一个回购意味着什么。它们只是集合,没有任何参考,没有排序。你可以说本地仓库有远程仓库没有的提交。但是你不能不谈论分支就说它是领先还是落后。不过,您也许可以说出回购是否是最新的。
此外,当与远程通信时,本地 git 客户端不知道本地分支提示和远程分支之间有多少提交。在本地传输数据之前,它不会知道这一点。
相反,您可以做的是 run 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
并从上游获取修订版,您想要什么是可能的。如果您愿意这样做,那么以上内容可能对您有用。
我知道这个问题不再那么新鲜了,但我写了一个开源工具正是出于这个原因:它找到本地 git 存储库并跟踪它们的状态,显示当前分支和所有本地存储库的状态字符串一个地方。
这也使它成为您所有 (git) 开发任务的完美起点。
如果您使用的是 Windows,您可能会享受到额外的效果:
因为使用 git,您通常没有专用的分支文件夹,MyTool\trunk\...
或者MyTool\v2.0\...
您在使用 Windows 文件资源管理器时看不到您在哪个分支中积极工作。
因此,该工具最酷的地方在于,在运行时,它将通过添加当前分支和在文件资源管理器窗口中打开的存储库的状态字符串(如果有)来自动增强所有文件资源管理器窗口。
它是 100% 开源的,所以请试一试,如果您愿意贡献,我会非常高兴。
RepoZ 现在带有一个名为 grr 的命令行增强功能,它利用来自 RepoZ 的聚合存储库信息在命令行中显示实时数据以及使用以下命令从存储库跳转到存储库的可能性cd
:grr cd RepoZ
假设您在包含大量 git repo 文件夹的文件夹中的快速单线:
find . -maxdepth 1 -type d -exec sh -c "(cd '{}' && pwd && git status)" \;