Linux 检查本地git回购是否在远程回购之前/之后
我正在开发一个git插件,我需要知道何时使用命令行更改本地repo(可以提交更改)、提前(可以推到远程)或延迟(可以从远程拉) 这就是我目前正在做的:Linux 检查本地git回购是否在远程回购之前/之后,linux,git,bash,shell,github,Linux,Git,Bash,Shell,Github,我正在开发一个git插件,我需要知道何时使用命令行更改本地repo(可以提交更改)、提前(可以推到远程)或延迟(可以从远程拉) 这就是我目前正在做的: 你能承诺吗 如果git diff index--name only--ignore submodules HEAD--返回一些内容, 然后是的,有更改要提交 你能推吗 如果git status-sb在其输出中包含前面的单词,那么是的,在那里 是要推的 你会拉吗 还没有实施任何措施 谁能承诺?这部分似乎工作正常。你能推吗?只适用于主分支,这是一
- 你能承诺吗
如果
返回一些内容, 然后是的,有更改要提交git diff index--name only--ignore submodules HEAD--
- 你能推吗
如果
在其输出中包含前面的单词,那么是的,在那里 是要推的git status-sb
- 你会拉吗 还没有实施任何措施
我如何安全地检查git回购在每个分支上是否都有要提交的更改、要推送的更改或需要
git拉取?您可以通过
和
的组合来实现这一点。如果git merge base
返回与git rev parse
相同的结果,那么您的本地分支就在前面。如果它返回与git rev parse相同的值,那么您的本地分支就落后了。如果merge base
返回的答案与rev parse
中的任何一个不同,则分支已分叉,您需要进行合并
不过,最好在检查分支之前执行git fetch
,否则您是否需要提取的决定将过时。您还需要验证所检查的每个分支是否都有一个远程跟踪分支。您可以使用--format='%(上游:short)“refs/heads/
来完成此操作。该命令将返回
的远程跟踪分支,如果没有,则返回空字符串。因此,如果分支没有远程跟踪分支,则会有一个不同的版本返回错误,这可能对您的目的更有用。最后,我在我的C++11中实现了这一点
到目前为止似乎有效canPull
仍需要测试和实现
说明:
currentBranch
获取控制台输出,它是当前分支名称的字符串
canCommit
获取控制台是否输出某些内容(当前更改和HEAD之间的差异,忽略子模块)
canPush
获取origin/currentBranch
和本地回购之间的更改计数-如果>0
,则可以推送本地回购
多亏了@Trebor,我才拼凑了一个简单的fish函数:
#! /usr/bin/fish
#
# Echos (to stdout) whether your branch is up-to-date, behind, ahead or diverged from another branch.
# Don't forget to fetch before calling.
#
# @param branch
# @param otherbranch
#
# @echo string up-to-date/behind/ahead/diverged
#
# @example
#
# # if master is ahead of origin/master you can find out like this:
# #
# if test ( branch-status master origin/master ) = ahead
#
# echo "We should push"
#
# end
#
function branch-status
set -l a $argv[ 1 ]
set -l b $argv[ 2 ]
set -l base ( git merge-base $a $b )
set -l aref ( git rev-parse $a )
set -l bref ( git rev-parse $b )
if [ $aref = $bref ]; echo up-to-date
else if [ $aref = $base ]; echo behind
else if [ $bref = $base ]; echo ahead
else ; echo diverged
end
end
供日后参考。自Git v2.17.0起
git status -sb
包含后面的单词。
这样就可以直接用来检查拉力
注意:在运行git status-sb
之前,请记住运行git fetch
,我制作了一个bash版本的@user1115652 answer
function branch_status() {
local a="master" b="origin/master"
local base=$( git merge-base $a $b )
local aref=$( git rev-parse $a )
local bref=$( git rev-parse $b )
if [[ $aref == "$bref" ]]; then
echo up-to-date
elif [[ $aref == "$base" ]]; then
echo behind
elif [[ $bref == "$base" ]]; then
echo ahead
else
echo diverged
fi
}
对于推送部分,您将使用Git 2.5+(2015年第2季度)Git为每个ref--format=“%(推送:跟踪)”ref/heads
。更多信息,谢谢你。到目前为止,关于堆栈溢出的几篇文章给出了最清晰的答案。我将其转换为bash脚本。可以使用git rev list origin为我推送作品..HEAD
function branch_status() {
local a="master" b="origin/master"
local base=$( git merge-base $a $b )
local aref=$( git rev-parse $a )
local bref=$( git rev-parse $b )
if [[ $aref == "$bref" ]]; then
echo up-to-date
elif [[ $aref == "$base" ]]; then
echo behind
elif [[ $bref == "$base" ]]; then
echo ahead
else
echo diverged
fi
}