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

时间:2009-02-09 11:44:40

标签: git

在git clone之后,新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 pull”和“git push”。但我只对“git pull”感兴趣,因为我想推进另一个回购。

我能做的一件事是:

git add remote repo-for-push <some other url>
git push repo-for-push master

但我想配置git使用默认和不同的存储库进行拉取和推送,即:

git pull # pulls from origin
git push # pushes into repo-for-push, avoiding accidental push into the origin

如何配置? 提前谢谢。

编辑:
基本上,我想将默认的push repo设置为与默认的fetch / pull repo不同。

5 个答案:

答案 0 :(得分:35)

看起来像

git config remote.origin.receivepack /bin/false

使推送到远程原点失败。

答案 1 :(得分:27)

在版本1.6.4中,Git使用remote.name.pushurl配置设置获得了从一个URL进行远程提取并推送到另一个URL的功能。如果push-repository没有跟踪pull-repository,我可以想象出奇怪的行为,但是我怀疑Git会尝试从当前/跟踪/匹配分支快进来推送存储库,而不考虑它是什么当它询问遥控器的同名时会拉。

例如,如果你想通过匿名git协议,但通过SSH推送(也许你需要一个SecurID令牌或某些东西进行身份验证):

[remote "myremote"]
    url = git://server/path
    pushurl = user@server:/path

答案 2 :(得分:7)

我不确定你今天能用Git做到这一点。 git-fetch(在builtin-fetch.c中)和git-push(在builtin-push.c中)的实现都调用内部函数remote_get(NULL)来标识要从/推送到的默认存储库。 / p>

一种选择是创建一个指定所需仓库的别名。例如:

git config --add alias.mypush "push repo-for-push"

然后你可以:

git mypush

推送到您想要的回购。当然不完全是你想要的。 (您也可以考虑推送--repo参数;请参阅http://kerneltrap.org/mailarchive/git/2008/10/7/3537694了解最新的文档更新,以澄清--repo参数。)

答案 3 :(得分:0)

如果您可以从另一个分支执行所有推送,我认为您可以将该分支配置为具有自己的单独存储库以推送到:

git checkout master
git branch outbound
git remote add destination <some url>
git config branch.outbound.remote destination

我没有尝试过这个,你可能需要做更多的工作来创建一个完整的解决方案。如果你必须从主人那里推出,它也可能不适合你。

答案 4 :(得分:0)

将“git”命令包含在吃掉push参数的内容中。我写下了这个:

~$ 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[@]}"  

请确保在“real”git命令之前在路径中包含wrapped命令。