GIT:安全并发推送是如何实现的? 让我们考虑Git在没有守护进程的情况下使用的例子。

GIT:安全并发推送是如何实现的? 让我们考虑Git在没有守护进程的情况下使用的例子。,git,concurrency,Git,Concurrency,所以我们没有git“服务器”,我们只有中央回购和两个用户及其git“客户端” 所以,据我所知,向repo添加新代码的工作将由用户的git程序(客户端)完成 如何提供安全的并发推送? 使用中央回购操作系统文件锁? 或者如何 Git在服务器上没有锁机制 您可以使用强制执行某些规则和策略 在钩子中,您可以阻止开发人员推送代码(锁定分支),以限制和阻止将覆盖您以前历史的强制推送 总结 Git不像其他SCM中那样具有锁定机制。相反,git使用钩子,钩子基本上是操作系统可以执行的任何语言的脚本,在那里你可以

所以我们没有git“服务器”,我们只有中央回购和两个用户及其git“客户端”

所以,据我所知,向repo添加新代码的工作将由用户的git程序(客户端)完成

如何提供安全的并发推送?
使用中央回购操作系统文件锁?

或者如何

Git在服务器上没有锁机制

您可以使用强制执行某些规则和策略

在钩子中,您可以阻止开发人员推送代码(锁定分支),以限制和阻止将覆盖您以前历史的
强制推送

总结 Git不像其他SCM中那样具有锁定机制。相反,git使用钩子,钩子基本上是操作系统可以执行的任何语言的脚本,在那里你可以做任何你需要的事情


例子: 下面是一个示例代码:

#!/bin/bash

protected_branch='master'  
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

if [ $protected_branch = $current_branch ]  
then  
    read -p "You're about to push master, is that what you intended? [y|n] " -n 1 -r < /dev/tty
    echo
        if echo $REPLY | grep -E '^[Yy]$' > /dev/null
        then
            exit 0 # push will execute
        fi
        exit 1 # push will not execute
else  
    exit 0 # push will execute
fi  
protected\u branch='master'
当前分支=$(git符号参考头| sed-e,.*/\(.*\),\1')
如果[$protected\u branch=$current\u branch]
然后
阅读-p“您即将推送master,这是您的意图吗?[y | n]”-n1-r/dev/null
然后
退出0#将执行推送
fi
退出1#将不执行推送
其他的
退出0#将执行推送
fi

防止并发推送的基本保护包括:

  • 通过推送专用分支避免并发推送
  • 保护分支(或仅允许积分器推动分支
  • 同样的想法(一个集成器更新一个分支)是通过使用fork(或)来只通过pull请求接受更新
但从技术上讲,针对同一回购协议的同一分支的并发推送取决于git后端的管理方式。
这就是我们正在进行的改进。它将:

  • (意味着后端已经有了锁定机制,即使用户看不到锁)
  • (being----一个常规文件,它存储以
    ref:refs/
    开头的字符串。例如,您的
    .git/HEAD
    是一个常规文件,其内容是
    ref:refs/heads/master
由于 符号参照的拆分不会在锁定状态下发生

<强>因此,在该操作的中间<或强>中,可以用一个普通的REF来代替符号REF,这会导致重排不连续性和丢失旧的REF检查。


该补丁将提高真正的并发更新可靠性。

值得注意的是,当使用正常的
git push
机制并且不重新指向符号引用时,git正确地处理锁定(对于某些“correct”的定义来说),使得一个推送在另一个推送开始之前完成。(至少在git 1.6左右的版本中是这样。但是,post接收脚本不会在锁定的情况下运行,这意味着两个单独的post接收可能都会看到第二次更新,例如。)