如何配置git以避免意外的git推送

如何配置git以避免意外的git推送,git,Git,git克隆后,新repo中的配置如下所示: remote.origin.url=<some url> remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* branch.master.remote=origin branch.master.merge=refs/heads/master 如何配置? 提前谢谢 编辑: 基本上,我想将默认的推式回购设置为不同于默认的获取/拉式回购。我不确定您现在是否可以在git中实现这一点。gi

git克隆后,新repo中的配置如下所示:

remote.origin.url=<some url>
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
如何配置? 提前谢谢

编辑:

基本上,我想将默认的推式回购设置为不同于默认的获取/拉式回购。

我不确定您现在是否可以在git中实现这一点。git fetch(在builtin fetch.c中)和git push(在builtin push.c中)的实现都调用内部函数remote_get(NULL)来标识要从/推送到的默认存储库

一个选项是创建一个别名来指定所需的回购。例如:

git config --add alias.mypush "push repo-for-push"
然后你可以:

git mypush

推动你想要的回购。当然,这并不完全是你想要的。(您也可以考虑“推送参数”来推动;参见最近的DOC更新,阐明了RePO参数。)

< P>如果您可以从另一个分支中进行所有推送,我认为您可以配置该分支以将其单独的存储库推送到:

git checkout master
git branch outbound
git remote add destination <some url>
git config branch.outbound.remote destination
git签出主机
git分支出站
git远程添加目标
git config branch.outbound.remote destination
我还没有尝试过这个,您可能需要做更多的工作来创建一个完整的解决方案。如果您必须从主机上推,它也可能不适用于您。

看起来像

git config remote.origin.receivepack /bin/false
使推送到远程源失败。

将“git”命令包装在吃推送参数的东西中。我在脑海里写下了这样一句话:

~$ cat /usr/local/bin/git #!/bin/bash # git wrapper # prevents pushing to repository declare -a args declare msg='' while [ $# -gt 0 ] do if [ "$1" != 'push' ]; then args=( "${args[@]}" "$1" ) else msg="No pushing" fi shift done if [ ${#msg} -gt 0 ]; then echo "$msg" fi /usr/bin/git "${args[@]}" ~$cat/usr/local/bin/git #!/bin/bash #git包装器 #防止推送到存储库 声明-a参数 声明msg='' 而[$#-gt 0] 做 如果[“$1”!=“推送”];然后 args=(“${args[@]}”“1”) 其他的 msg=“禁止推送” fi 转移 完成 如果[${msg}-gt 0];然后 回显“$msg” fi /usr/bin/git“${args[@]}” 只需确保在“真正的”git命令之前将wrapped命令放在您的路径中。

在版本中,git能够使用
remote.name.pushurl
config设置从一个URL远程拉入并推入另一个URL。如果推送存储库不跟踪拉送存储库,我可以想象出奇怪的行为,但我怀疑Git只会尝试从当前/跟踪/匹配分支快进推送存储库,而不考虑当它询问同名的远程存储库时会拉什么

例如,如果您希望通过匿名git协议进行拉取,但通过SSH进行推送(可能需要SecurID令牌的值或进行身份验证的内容):


因此,基本上您希望将默认的推式回购设置为不同于默认的获取/拉式回购,对吗?也许你应该澄清一下。对,那是一样的,但用更少的词:)别名“推式回购换推”和“推式回购换推式回购”都是很好的解决办法。谢谢。正如@Novelocrat在回答中指出的,从1.6.4开始,这不再是事实。使用此解决方案,我必须手动合并两个分支,并正确地了解当前git push xor git pull的分支。如果在当前分支不正确的情况下,我无法将git配置为避免/取消/禁止git拉入或推入,那么这并不比别名更好。谢谢正如@Novelocrat的回答中所指出的,这不再是必需的。好主意,但它应该在用户文件系统中,并且当存在一些没有此限制的存储库时,它应该检查当前工作目录。谢谢。有些协议是只读的吗?这也会使推送到错误的存储库失败。@Andrew:对,如果你通过git协议克隆,你会被设置。如何恢复它?
git config remote.origin.receivepack /bin/false
~$ cat /usr/local/bin/git #!/bin/bash # git wrapper # prevents pushing to repository declare -a args declare msg='' while [ $# -gt 0 ] do if [ "$1" != 'push' ]; then args=( "${args[@]}" "$1" ) else msg="No pushing" fi shift done if [ ${#msg} -gt 0 ]; then echo "$msg" fi /usr/bin/git "${args[@]}"
[remote "myremote"]
    url = git://server/path
    pushurl = user@server:/path