在遥控器上更改分支历史记录时,通常会得到
o git@git.server.com:XXXXX/Project.git
+ efe2e8b...cda0ee7 HEAD -> Ant_Config_processing (forced update)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用脚本获得此(强制更新)状态?
我们的想法是编写一个检测它的别名并提示用户执行操作.
kya*_*nny 24
我有类似的问题,我想出来了.
我想在远程(裸)存储库中的钩子脚本中检测强制更新,所以我的答案可能不适合原始问题,但我希望对未来的访问者有用.
https://github.com/kyanny/git-hooks-detect-force-update
这是一个示例git预接收挂钩脚本,用于了解如何检测强制更新.
$ git rev-list oldrev ^newrev
Run Code Online (Sandbox Code Playgroud)
$ rake -T
rake forced_push # git hooks test detect forced update
rake normal_push # git hooks test
Run Code Online (Sandbox Code Playgroud)
首先,我描述了git-rev-list(1)的语法.
在这种情况下,我们假设在具有这种直接历史的Git工作存储库中.
1 --- 2 --- O --- X --- 3 --- 4 --- N
Run Code Online (Sandbox Code Playgroud)
一般用法git-rev-list如下.
$ git rev-list N
Run Code Online (Sandbox Code Playgroud)
此命令将显示从提交N可到达的所有提交(注意:git-rev-list显示提交反向时间顺序)
git-rev-list 接受多个参数.
$ git rev-list N O
Run Code Online (Sandbox Code Playgroud)
此命令将显示与输出相同的输出git rev-list N,因为提交O是提交N的祖先.
然后,git-rev-list允许您从输出中排除提交.
$ git rev-list N ^O
Run Code Online (Sandbox Code Playgroud)
^ O表示要排除从O可到达的提交,因此该命令将显示N,4,3,X(注意:O被排除在外)
自从我们了解到git-rev-list,我描述了一个关于强制更新的案例.
在这种情况下,我们假设在具有此复杂历史的Git工作存储库中.
* --- B --- * --- O ($oldrev)
\
* --- X --- * --- N ($newrev)
Run Code Online (Sandbox Code Playgroud)
推送时,使用标准输入调用钩子预接收脚本.stdin参数的格式在githooks(5)中描述.
通常,我们从stdin中提取两个提交对象sha1 - oldrev和newrev.oldrev是老树的HEAD,newrev是新树的HEAD.
在这种情况下,我们可以通过git-rev-list输出检测强制推送.
git rev-list oldrev ^newrev显示从oldrev可以访问但从newrev无法访问的提交.这表明提交只存在于旧树中.如果此命令显示任何提交,则旧树被替换为新树,因此发生了强制更新.这就是我们想要的!
如果此命令不显示任何提交,则通常会更新新树,因此未发生强制更新.只是.
一种方法是使用git reflog它,它记录了对分支的更改.
使用reflog,你可以在pull/fetch之前获得你的分支指向的位置(如果它是脚本化的话我会使用fetch,因为它不会自动合并)并检查是否可以从新远程的"tip"获取该提交.分支.
使用bash你可以试试这个:
$ git rev-list remotename/branchname | grep $(git rev-parse remotename/branchname@{1})
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
如果它返回一个哈希(或退出状态0),则意味着它在分支历史记录中找到了我们之前的分支提示,因此它是一个快进合并.如果它什么也没有返回(或退出状态1),则强制更新.
您可以检查git reflog remotename/branchname输出以查看branchname是否获得强制更新.
$ git reflog remotename/branchname
dc2afab refs/remotes/remotename/branchname@{0}: fetch rewrite: forced-update
4603c2c refs/remotes/remotename/branchname@{1}: fetch rewrite: forced-update
Run Code Online (Sandbox Code Playgroud)