如何知道git存储库是否有未与服务器(源)同步的更改?

And*_*ndy 12 git cvs scripting

我在Git中设置了大量项目,这些项目以前是在CVS中管理的.如果我对尚未发送到中央服务器的存储库进行了更改,那么Tortoise CVS以及Eclipse都很容易看到(通过图标叠加).

有没有一种方便的方法来实现这一点与Git?我真的不需要图标叠加 - 我只需要知道在将我的分支与原始分支进行比较时是否有突出的变化.我不介意使用某种脚本来查询所有的Git回购.

man*_*lds 8

类似的东西git log origin/master..master应该给你你做过的提交而不是推送.如果您获取原点,那么git log master..origin/master您可以在远程主站中看到提交.您还git log origin/master...master可以查看本地和远程的新提交.

您可以替换git log使用git rev-list,容易弄清楚,如果啥也不在脚本中如果需要推.


Chr*_*sen 6

以下示例仅处理单个存储库.在周围的脚本中使用循环在多个存储库上运行它们.

git fetch origin在使用以下命令之前,您可能希望运行(例如)更新本地远程跟踪分支(以便您检查上游分支的最新提示).

如果您只关心当前签出的分支:

git status -sb
Run Code Online (Sandbox Code Playgroud)

如果第一行报告"提前",则当前分支具有不属于其上游分支的提交.该命令的输出不适合程序直接使用(它是"瓷器"命令).对于程序化消费,使用"plumbing"命令列出"提前"提交:

git rev-list HEAD@{upstream}..HEAD
Run Code Online (Sandbox Code Playgroud)

您可以通过管道wc -l来获取计数.如果您只对"提前"状态(不是确切的计数)感兴趣,那么test -n "$(git rev-list -n 1 HEAD@{upstream}..HEAD)"可能会更快.

如果要检查存储库的所有分支:

git branch -v
Run Code Online (Sandbox Code Playgroud)

同样,对于具有不属于其上游分支的提交的分支,您将看到"超前".这也是一个"瓷器"命令,所以如果你想要可靠地检测程序中的状态,那么你会想要使用一些"管道"命令:

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
Run Code Online (Sandbox Code Playgroud)

调整echo语句(或用其他命令替换它们)以满足您的目的.