git - 如何检测强制更新

标签 git

当远程分支历史记录发生更改时,您通常会得到

o git@git.server.com:XXXXX/Project.git
 + efe2e8b...cda0ee7 HEAD -> Ant_Config_processing (forced update)

有没有办法使用脚本来获取这个(强制更新)状态?

想法是编写一个别名来检测它并提示用户执行操作。

最佳答案

我有一个类似的问题,我想通了。

我想在远程(裸)存储库的钩子(Hook)脚本中检测强制更新,所以我的回答可能不适合原始问题,但我希望我的回答对 future 的访问者有用。


如何从 Git hooks 脚本中检测是否强制更新

https://github.com/kyanny/git-hooks-detect-force-update

这是一个示例 git 预接收钩子(Hook)脚本,用于学习如何检测强制更新。

结论

$ 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

此命令将显示从提交 N 可到达的所有提交(注意:git-rev-list 显示提交倒序)

git-rev-list 接受多个参数。

$ git rev-list N O

此命令将显示与 git rev-list N 相同的输出,因为提交 O 是提交 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)
  1. 在旧树中,我们有 4 个提交(*、B、*、O)并将它们推送到远程。
  2. 我们从提交 B 中 check out 一个新分支,它是新树。
  3. 在新树中,我们有 4 个提交(*、X、*、N)并使用 --force 选项将它们推送到远程!

推送时, Hook 使用标准输入调用的预接收脚本。 stdin 参数的格式在 githooks(5) 中描述。 .

通常,我们从标准输入中提取两个提交对象 sha1 - oldrev 和 newrev。 oldrev 是旧树的 HEAD,newrev 是新树的 HEAD

在这种情况下,我们可以通过git-rev-list输出来检测强制推送。

git rev-list oldrev ^newrev 显示可从 oldrev 访问但无法从 newrev 访问的提交。这表明提交只存在于旧树。 如果此命令显示任何提交,旧树将被新树替换,因此发生强制更新。这就是我们想要的!

如果此命令没有显示任何提交,则新树已正常更新,因此不会发生强制更新。很简单。

另见

关于git - 如何检测强制更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10319110/

相关文章:

svn - Drupal 7 CVS、SVN 或 git 访问

git - Ssh 总是忘记 key

node.js - 在 Elastic Beanstalk 上通过 .ebextensions 安装 git

git - merge pull 请求后 git 标签会发生什么

git reset --hard to commit 不起作用 - 提示 HEAD 落后了

git - 在 Mac 上更改 Git 存储库下载路径

git - 同时 git add -p 和 git checkout -p

java - 将 git 子模块中的 gradle 文件应用到同一目录中的另一个 gradle 文件

ruby-on-rails - 乱序 merge ActiveRecord 迁移

python - 通过将 git 命令传递给 python 中的子进程来获取最后一次 git 提交日期