问题描述
|
我在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 \'命令的操作仍然有些阴暗-但这似乎吐出了我想要的信息。