Answers:
我认为您无法删除推送URL,只能将其覆盖为推送URL 之外的其他内容。所以我认为最接近的是这样的:
$ git remote set-url --push origin no-pushing
$ git push
fatal: 'no-pushing' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
您将推送URL设置为no-pushing
,只要您的工作目录中没有同名文件夹,git就无法找到。本质上,您是在强制git使用不存在的位置。
git remote set-url --push origin -- --read-only--
-请注意额外的内容,--
以允许使用带引号的破折号。这对我来说更具可读性。
除了将推送网址更改为无效的内容(例如git remote set-url --push origin DISABLED
)外,还可以使用该pre-push
钩子。
一种快速的停止方法git push
是将符号链接/usr/bin/false
作为钩子:
$ ln -s /usr/bin/false .git/hooks/pre-push
$ git push
error: failed to push some refs to '...'
如果需要,使用钩子可以更精细地控制推动。请参阅.git/hooks/pre-push.sample
以获取有关如何防止推送正在进行的工作提交的示例。
为了防止推送到特定分支或限制推送到单个分支,在示例挂钩中可以这样做:
$ cat .git/hooks/pre-push
#!/usr/bin/sh
# An example hook script to limit pushing to a single remote.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If this script exits with a non-zero status nothing will be pushed.
remote="$1"
url="$2"
[[ "$remote" == "origin" ]]
具有多个遥控器的测试仓库:
$ git remote -v
origin ../gitorigin (fetch)
origin ../gitorigin (push)
upstream ../gitupstream (fetch)
upstream ../gitupstream (push)
origin
允许推送到:
$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 222 bytes | 222.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../gitorigin
* [new branch] master -> master
不允许推送到任何其他遥控器:
$ git push upstream
error: failed to push some refs to '../gitupstream'
请注意,pre-push
钩子脚本可以修改为,除其他外,向stderr打印一条消息,指出该推送已被禁用。
通用声明“ Git将拒绝推送到非裸仓库”是不正确的。仅当您尝试将与远程存储库的检出工作目录位于同一分支上的更改推送到Git时,Git才会拒绝将其推送到非裸露的远程存储库。
这个答案给出了一个简单的解释:https : //stackoverflow.com/a/2933656/1866402
(我将其添加为答案,因为我没有足够的声誉来添加评论)
如果您已经设置了远程设置,并且只是想防止自己意外执行诸如直接将其推向master
或的操作release/production
,则可以防止使用git config
。
# prevent pushing to branch: master
$ git config branch.master.pushRemote no_push
# prevent pushing to branch: release/production
$ git config branch.release/production.pushRemote no_push
出于记录,no_push
不是特殊名称。它只是任何不存在的分支的名称。因此您可以使用$ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master
它,并且效果很好。