在远程更改分支历史记录时,通常
o git@git.server.com:XXXXX/Project.git
+ efe2e8b...cda0ee7 HEAD -> Ant_Config_processing (forced update)
是否有任何方法可以使用脚本获取此(强制更新)状态?
其思想是编写一个别名来检测它并提示用户执行操作。
最佳答案
我也有类似的问题,我解决了。
我想在远程(裸机)存储库的hook脚本中检测强制更新,所以我的答案可能不适合原始问题,但我希望对将来的访问者有用。
如何在Git Hooks脚本中检测强制更新或非强制更新
https://github.com/kyanny/git-hooks-detect-force-update
这是一个Git预接收钩子脚本示例,用于了解如何检测强制更新。
结论
$ git rev-list oldrev ^newrev
如何测试
$ rake -T
rake forced_push # git hooks test detect forced update
rake normal_push # git hooks test
逐步介绍
首先,我描述了git-rev-list(1)的语法。
在这种情况下,我们假设在一个具有这种直接历史的Git工作存储库中。
1 --- 2 --- O --- X --- 3 --- 4 --- N
git-rev-list
的一般用法如下。$ git rev-list N
此命令将显示从commit n可访问的所有提交(注意:
git-rev-list
显示提交逆时间顺序)git-rev-list
接受多个参数。$ git rev-list N O
此命令将显示与
git rev-list N
相同的输出,因为commit o是commit n的祖先。然后,
git-rev-list
允许您从输出中排除提交。$ git rev-list N ^O
^ o意味着要从o中排除可到达的提交,所以此命令将显示n、4、3、x(注意:o被排除)
因为我们了解了
git-rev-list
,所以我描述了一个关于发生强制更新的案例。在这种情况下,我们假设在具有这种复杂历史的Git工作存储库中。
* --- B --- * --- O ($oldrev)
\
* --- X --- * --- N ($newrev)
在旧的树中,我们有4个提交(,,b,*,o)并将它们推到远程。
我们从commit b签出一个新的分支,这是一个新的树。
在新的树中,我们有4个提交(,,x,*,n),并用--force选项将它们推到远程!
当按下时,钩住用标准输入调用的预接收脚本。stdin参数的格式在githooks(5)中描述。
通常,我们从stdin-oldrev和newrev中提取两个commit对象sha1。老树是老树的头,新树是新树的头。
在这种情况下,我们可以通过输出来检测强制推。
git-rev-list
显示可从OldRev访问但不能从NewRev访问的提交。这表明提交只存在于旧树中。如果此命令显示任何提交,则旧树已替换为新树,因此发生了强制更新。这就是我们想要的!
如果此命令不显示任何提交,则通常会更新新树,因此不会发生强制更新。很简单。
另请参见
git-rev-list(1)
Git hook example: post-receive-email
git - How to detect a forced update - Stack Overflow
githooks - Git hook to detect push --mirror - Stack Overflow