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。| 归档时间: |
|
| 查看次数: |
5637 次 |
| 最近记录: |