Vit*_*meo 8 linux git bash shell github
我正在开发一个Git插件,我需要知道,当一个本地回购被改变(可提交更改),未来(可推送到远程)或后面(可以从远程拉)使用命令行.
这就是我到目前为止所做的事情:
可以提交?
如果git diff-index --name-only --ignore-submodules HEAD --
返回一些东西,那么是的,有提交的更改.
可以推吗?
如果在其输出中git status -sb
包含前面的单词,那么是,有提交要推送.
能拉吗?
还没有实现.
在可以提交?部分似乎工作正常.可以推吗?仅适用于主分支,这是一个很大的问题.
如何在每个分支上安全地检查git repo是否有提交更改,提交推送或需要更改git pull
?
小智 17
备查。从 Git v2.17.0 开始
git status -sb
Run Code Online (Sandbox Code Playgroud)
包含后面的词。这样就可以直接使用它来检查拉动。
注意:运行git fetch
前记得运行git status -sb
你可以结合使用git merge-base
和git rev-parse
.如果git merge-base <branch> <remote branch>
返回相同git rev-parse <remote branch>
,那么您的本地分支就在前面.如果它返回相同git rev-parse <branch>
,那么你的本地分支就落后了.如果merge-base
返回的答案与其中任何一个不同rev-parse
,则分支已经分歧,您需要进行合并.
最好git fetch
在检查分支机构之前做一个,但是,你确定是否需要拉动将是过时的.您还需要验证您检查的每个分支都有远程跟踪分支.你可以git for-each-ref --format='%(upstream:short)' refs/heads/<branch>
用来做那件事.该命令将返回远程跟踪分支<branch>
或空字符串(如果没有).在SO的某个地方有一个不同的版本,如果分支没有远程跟踪分支,它将返回错误,这可能对您的目的更有用.
最后,我在我的 C++11 git-ws 插件中实现了这个。
string currentBranch = run("git rev-parse --abbrev-ref HEAD");
bool canCommit = run("git diff-index --name-only --ignore-submodules HEAD --").empty();
bool canPush = stoi(run("git rev-list HEAD...origin/" + currentBranch + " --ignore-submodules --count")[0]) > 0;
Run Code Online (Sandbox Code Playgroud)
到目前为止似乎工作。canPull
仍然需要测试和实施。
解释:
currentBranch
获取控制台输出,这是当前分支名称的字符串canCommit
获取控制台是否输出某些内容(当前更改和 HEAD 之间的差异,忽略子模块)canPush
获取 origin/currentBranch
和本地仓库之间变化的计数- 如果> 0
,则可以推送本地仓库从这个答案。
git fetch
。behind_count = $(git rev-list --count HEAD..@{u})
.ahead_count = $(git rev-list --count @{u}..HEAD)
. (它假设您从哪里获取就是您推送到的位置,请参阅push.default
配置选项)。behind_count
和ahead_count
都为 0,则当前分支是最新的。behind_count
为 0 且ahead_count
大于 0,则当前分支在前面。behind_count
大于0且ahead_count
为0,则当前分支落后。behind_count
和ahead_count
都大于 0,则当前分支发散。解释:
git rev-list
列出所有提交范围的提交。--count
选项输出将列出多少提交,并禁止所有其他输出。HEAD
命名当前分支。@{u}
指当前分支的本地上游(用branch.<name>.remote
和配置branch.<name>.merge
)。还有@{push}
,它通常是指向一样的@{u}
。<rev1>..<rev2>
指定提交范围,包括可从 访问的提交,但不包括可从 访问的提交。当省略 or 时,默认为 HEAD。