【问题标题】:How to configure git to avoid accidental git push如何配置git避免意外git push
【发布时间】:2023-03-07 11:59:01
【问题描述】:

在 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

如何配置? 提前致谢。

编辑:
基本上,我想将默认推送存储库设置为与默认获取/拉取存储库不同。

【问题讨论】:

  • 所以基本上你想设置默认的推送仓库与默认的获取/拉取仓库不同,对吧?也许你应该澄清一下。
  • 对,还是一样的,但是字少了,:)

标签: git


【解决方案1】:

看起来像

git config remote.origin.receivepack /bin/false

使推送到远程源失败。

【讨论】:

  • 某些协议是只读的吗?这也会导致推送到错误的存储库失败。
  • @Andrew:对,如果你通过 git 协议克隆,你就会被设置。
  • 如何恢复?
【解决方案2】:

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

例如,如果您想通过匿名 git 协议拉取,但通过 SSH 推送(也许您需要一个 SecurID 令牌的值或其他东西来进行身份验证):

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

【讨论】:

    【解决方案3】:

    我不确定你今天真的可以在 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
    

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

    【讨论】:

    • “push repo-for-push”和“push --repo repo-for-push”的别名都是很好的解决方法。谢谢。
    • 正如@Novelocrat 的回答中指出的那样,从 1.6.4 开始,这不再适用。
    【解决方案4】:

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

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

    我还没有尝试过,您可能需要做更多的工作来创建完整的解决方案。如果您必须从 master 推送,它也可能不适合您。

    【讨论】:

    • 使用此解决方案,我必须手动合并两个分支并注意当前分支以正确 git push xor git pull。如果我无法配置 git 来避免/取消/禁止在当前分支不是正确分支时进行 git pull 或 push,则不比别名更好。谢谢!
    • 正如@Novelocrat 的回答中所述,这不再是必需的。
    【解决方案5】:

    将“git”命令包装在吃 push 参数的东西中。在我的脑海中,我写了这个:

    ~$ 猫 /usr/local/bin/git #!/bin/bash # git 包装器 # 防止推送到存储库 声明 -a 参数 声明味精='' 而 [ $# -gt 0 ] 做 如果 [ "$1" != '推' ];然后 args=( "${args[@]}" "$1" ) 别的 msg="不推送" 菲 转移 完毕 如果 [ ${#msg} -gt 0 ];然后 回声“$味精” 菲 /usr/bin/git "${args[@]}"

    请确保在“真正的”git 命令之前在路径中包含包装命令。

    【讨论】:

    • 好主意,但它应该在用户文件系统中,当有一些没有此限制的存储库时,它应该检查当前工作目录。谢谢。
    猜你喜欢
    • 2012-08-28
    • 2012-08-19
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-05-23
    • 2015-06-22
    相关资源
    最近更新 更多