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

34

在 git clone 之后,新仓库中的配置看起来像是:

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 仓库设置为与默认的 fetch/pull 仓库不同。


所以基本上你想要设置默认的推送仓库与默认的拉取/获取仓库不同,对吗?也许你应该澄清一下。 - kch
2
没错,这个意思一样,只是用更少的词来表达, :) - Daniel Fanjul
5个回答

36

看起来像是

git config remote.origin.receivepack /bin/false

推送到远程源(origin)时失败。


有些协议是只读的吗?这也会导致将代码推送到错误的代码库失败。 - Andrew Grimm
@Andrew:没错,如果你通过git协议进行克隆,就可以了。 - Cascabel
如何撤销它? - Bishwas Mishra

27
在版本1.6.4中,Git获得了一个新功能,可以使用remote.name.pushurl配置来从一个URL拉取远程仓库并推送到另一个仓库。如果推送仓库没有跟踪拉取仓库,我可以想象会出现奇怪的行为,但我认为Git只是尝试从当前/跟踪/匹配的分支中快速向前推进推送仓库,而不考虑请求同名远程仓库时将要拉取什么。

例如,如果您想通过匿名git协议进行拉取,但需要通过SSH进行推送(也许您需要一个SecurID token之类的值来进行身份验证):
[remote "myremote"]
    url = git://server/path
    pushurl = user@server:/path

7

我不确定你是否能在当前的git版本中实现这个功能。在builtin-fetch.c文件中,git-fetch的实现以及在builtin-push.c文件中,git-push的实现都会调用remote_get(NULL)函数来识别默认的仓库进行pull-from/push-to操作。

一个解决方法是创建一个别名(alias),指定你想要的仓库。例如:

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

那么你可以:
git mypush

将代码推送到您想要的仓库。当然,这不是精确的。您也可以考虑使用--repo参数进行推送;请参阅http://kerneltrap.org/mailarchive/git/2008/10/7/3537694获取最近更新的文档以澄清--repo参数。


“push repo-for-push”的别名和“push --repo repo-for-push”的别名都是不错的解决办法。谢谢。 - Daniel Fanjul
正如@Novelocrat的回答所指出的那样,从1.6.4版本开始,这个说法已不再正确。 - Andrew Aylett

0

将“git”命令包装在某个东西中,以吃掉push参数。我脑海中想到的是:

~$ cat /usr/local/bin/git
#!/bin/bash
# git包装器 # 防止向存储库推送
declare -a args declare msg='' while [ $# -gt 0 ] do if [ "$1" != 'push' ]; then args=( "${args[@]}" "$1" ) else msg="不允许推送" fi shift done if [ ${#msg} -gt 0 ]; then echo "$msg" fi /usr/bin/git "${args[@]}"

只需确保在“真正”的git命令之前将包装后的命令放在您的路径中即可。


不错的想法,但应该在用户文件系统中,并且在存在没有此限制的存储库时应检查当前工作目录。谢谢。 - Daniel Fanjul

0

如果您可以从另一个分支进行所有推送,我认为您可以配置该分支拥有自己独立的存储库以供推送:

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

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


使用这种解决方案,我必须手动合并两个分支,并注意当前分支以正确地进行 git push 或 git pull。如果我无法配置 git 以避免/取消/禁止在当前分支不正确时进行 git pull 或 push,则与别名无异。谢谢! - Daniel Fanjul
正如@Novelocrat的回答所指出的那样,这已不再需要。 - Andrew Aylett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接