我想提取a之后打印的信息,git status如下所示:
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
Run Code Online (Sandbox Code Playgroud)
当然我可以解析输出,git status但不建议这样做,因为这个人类可读输出容易改变.
有两个问题:
origin/branch但不一定是这样.jam*_*san 22
git rev-list origin..HEAD 将显示当前分支中的提交,但不显示原始提交 - 即,您是否先于原点和提交.
git rev-list HEAD..origin 将显示相反的情况.
如果两个命令都显示提交,那么您有分支分支.
ara*_*nid 18
更新
正如amalloy所指出的,最近版本的git支持通过为跟踪分支提供"branchname @ {upstream}"(或"branchname @ {u}"或"@ {u}"来查找给定分支的匹配跟踪分支(HEAD).这有效地取代了下面的脚本.你可以做:
git rev-list @{u}..
git rev-list --left-right --boundary @{u}...
gitk @{u}...
Run Code Online (Sandbox Code Playgroud)
等等.例如,我有git q别名,git log --pretty='...' @{u}..以告诉我"排队"提交准备推送.
原始答案
似乎没有一种简单的方法可以找到一般的跟踪分支,而不需要解析比一些shell命令更多的git配置.但对于许多情况,这将有很长的路要走:
# work out the current branch name
currentbranch=$(expr $(git symbolic-ref HEAD) : 'refs/heads/\(.*\)')
[ -n "$currentbranch" ] || die "You don't seem to be on a branch"
# look up this branch in the configuration
remote=$(git config branch.$currentbranch.remote)
remote_ref=$(git config branch.$currentbranch.merge)
# convert the remote ref into the tracking ref... this is a hack
remote_branch=$(expr $remote_ref : 'refs/heads/\(.*\)')
tracking_branch=refs/remotes/$remote/$remote_branch
# now $tracking_branch should be the local ref tracking HEAD
git rev-list $tracking_branch..HEAD
Run Code Online (Sandbox Code Playgroud)
另一种更蛮力的方法:
git rev-list HEAD --not --remotes
Run Code Online (Sandbox Code Playgroud)
jamessan的答案解释了如何使用找到$ tracking_branch和HEAD之间的相对差异git rev-list.你可以做的一件有趣的事情:
git rev-list --left-right $tracking_branch...HEAD
Run Code Online (Sandbox Code Playgroud)
(注意$ tracking_branch和HEAD之间的三个点).这将显示两个"武器"的提交,前面有一个区别标记:"<"用于提交$ tracking_branch,">"用于提交HEAD.
max*_*max 11
你可以试试git branch -v -v.使用-v两次标志,它输出上游分支的名称.样本输出:
* devel 7a5ff2c [origin/devel: ahead 1] smaller file status overlay icons
master 37ca389 [origin/master] initial project check-in.
Run Code Online (Sandbox Code Playgroud)
我认为这种格式比git status输出更稳定.
编辑:
我的原始答案实际上并不是很好,因为它依赖于用户拥有一个名为"origin"的遥控器.如果当前分支除起源头之外还有一个跟踪分支,它也会失败.这些缺陷基本上使它变得毫无用处.然而,@araqnid的答案并不是最有效的方法,他到达的方式$tracking_branch并不比海峡前进更好.我发现获得相同功能的最有效(最快)的方法如下:
# get the tracking-branch name
tracking_branch=$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))
# creates global variables $1 and $2 based on left vs. right tracking
# inspired by @adam_spiers
set -- $(git rev-list --left-right --count $tracking_branch...HEAD)
behind=$1
ahead=$2
Run Code Online (Sandbox Code Playgroud)
也许我能找到最简单的方法(灵感来自@insidepower)
# count the number of logs
behind=$(git log --oneline HEAD..origin | wc -l)
ahead=$( git log --oneline origin..HEAD | wc -l)
Run Code Online (Sandbox Code Playgroud)
我以前一直使用@araqnid的方法,但现在我想我会将一些脚本移动到这个方法,因为它更简单.这适用于任何unix系统.
git status有一个--porcelain用于脚本解析的选项.它基于--short输出 - 它们在编写时几乎完全相同(有关详细信息,请参阅git status手册页的"Porcelain Format"部分).主要区别在于--short有颜色输出.
默认情况下,不会显示分支信息,但如果添加--branch选项,您将获得如下输出:
git status --short --branch
## master...origin/master [ahead 1]
?? untrackedfile.txt
...
Run Code Online (Sandbox Code Playgroud)
如果你是最新的(在获取后),分支线将只是:
## master
Run Code Online (Sandbox Code Playgroud)
如果你领先:
## master...origin/master [ahead 1]
Run Code Online (Sandbox Code Playgroud)
如果你落后了:
## master...origin/master [behind 58]
Run Code Online (Sandbox Code Playgroud)
对于两者:
## master...origin/master [ahead 1, behind 58]
Run Code Online (Sandbox Code Playgroud)
请注意,git status --porcelain --branch仅在1.7.10.3或更高版本中git status --short --branch可用(尽管自1.7.2开始可用).
在现代版本的git中,@{u}指向当前分支的上游(如果已设置).
因此,要计算远程跟踪分支后面的提交数量:
git rev-list HEAD..@{u} | wc -l
Run Code Online (Sandbox Code Playgroud)
要了解您在遥控器前的距离,只需切换订单:
git rev-list @{u}..HEAD | wc -l
Run Code Online (Sandbox Code Playgroud)
对于更易于理解的摘要,您可以要求输入日志:
git log --pretty=oneline @{u}..HEAD
Run Code Online (Sandbox Code Playgroud)
出于我自己的目的,我正在编写一个脚本@{u},如果尚未设置上游,则将替换为适当的猜测.不幸的是,此时没有@{d}代表下游(你会推到哪里).
| 归档时间: |
|
| 查看次数: |
13677 次 |
| 最近记录: |