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