如何知道git信息库是否有尚未与服务器源同步的更改?

问题描述

| 我在Git中设置了大量项目,这些项目以前是在CVS中管理的。如果我对尚未发送到中央服务器的存储库进行了更改,那么Tortoise CVS和Eclipse都非常易于查看(通过图标覆盖)。 用Git有实现此目的的便捷方法吗?我真的不需要图标叠加层,我只需要知道将分支与原始分支进行比较时是否有显着更改。我不介意使用某种脚本来查询所有Git存储库。     

解决方法

诸如“ 0”之类的东西应该给您您已完成但未推送的提交。如果获取原点,然后执行
git log master..origin/master
,则可以看到远程主服务器中的提交。您也可以执行
git log origin/master...master
来查看本地和远程的新提交。 您可以将
git log
替换为
git rev-list
,并轻松找出是否需要将脚本中的内容以及未推送的内容。     ,以下示例仅处理单个存储库。在周围的脚本中使用循环可在多个存储库上运行它们。 在使用以下命令之前,您可能需要运行(例如)ѭ5来更新本地远程跟踪分支(以便检查上游分支的最新提示)。 如果仅关注当前已签出的分支:
git status -sb
如果第一行报告“ ahead”,则当前分支的提交不属于其上游分支。该命令的输出不适合直接由程序使用(这是“瓷器”命令)。对于程序消耗,请使用“管道”命令列出“预先”提交:
git rev-list HEAD@{upstream}..HEAD
您可以将其传送到
wc -l
进行计数。如果您只对“ ahead”状态感兴趣(而不是确切的计数),则
test -n \"$(git rev-list -n 1 HEAD@{upstream}..HEAD)\"
可能会更快。 如果要检查存储库的所有分支:
git branch -v
再次,对于提交不属于其上游分支的分支,您将看到“前进”。这也是一个“瓷器”命令,因此,如果要可靠地检测程序中的状态,则需要使用一些“管道”命令:
git for-each-ref --shell --format=\'
    b=%(refname:short)
    u=${b}\'@{upstream}\'
    if git rev-parse --verify --quiet \"$u\" >/dev/null 2>&1; then
        test -n \"$(git rev-list -n 1 \"$u..$b\")\" &&
        echo \"$b: has unpushed commits\"
    else
        echo \"$b: no upstream configuration\" >&2
    fi
\' refs/heads | sh
调整
echo
语句(或将其替换为其他命令)以适合您的目的。     ,如果您有一个名为origin的远程服务器,请尝试运行以下命令:
git remote show origin
这将给您一个不错的总结。 例如这就是我得到的
git % git remote show origin
* remote origin
  Fetch URL: git://git.kernel.org/pub/scm/git/git.git
  Push  URL: git://git.kernel.org/pub/scm/git/git.git
  HEAD branch: master
  Remote branches:
    html   tracked
    maint  tracked
    man    tracked
    master tracked
    next   tracked
    pu     tracked
    todo   tracked
  Local branches configured for \'git pull\':
    html   merges with remote html
    master merges with remote master
  Local refs configured for \'git push\':
    html   pushes to html   (local out of date)
    master pushes to master (local out of date)
这表明我的本地分支
html
master
已过期。如果我的遥控器上的提交不在我的本地仓库中,它将显示在为git pull配置的分支部分中。 用任何远程存储库的名称替换“ 17”。 如果您不知道起源的名称或其网址,请尝试以下操作:
git remote -v
这将为您提供遥控器及其URL的列表。 编辑添加 如果您有很多子模块,则可以使用
git submodule foreach
,如我在此处所述。您可以重定向输出并解析它以获取所需的内容。     ,昨天,我尝试推出自己的解决方案。这是我想出的(对于单个存储库):
#!/bin/sh

for ref in $(git for-each-ref --format=\'%(refname)\' refs/remotes/); do
    ending=${ref#refs/remotes/}
    remote=${ending%/*}
    branch=${ending#*/}
    if [ \"${branch}\" == \"HEAD\" ]; then continue; fi
    echo -e \"\\e[1;34m$branch on $remote\\e[0m\"
    echo \"AHEAD by:\"
    git log --oneline $branch ^$remote/$branch
    echo \"BEHIND by:\"
    git log --oneline $remote/$branch ^$branch
done
这是基于信息的,我已经提取了多个来源,包括此处的答案。给定我提供的参数,我对\'git log \'命令的操作仍然有些阴暗-但这似乎吐出了我想要的信息。