当我在我的一个配置了远程的Git存储库中运行git remote -v
时,我发现每个远程都有fetch和push specs:
$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)
对于指向同行开发人员的遥控器,没有必要推送,Git无论如何都会拒绝推送到非裸存储库。有没有办法将这些遥控器配置为“仅提取”而没有推送地址或功能?
答案 0 :(得分:158)
我认为你不能删除推送网址,你只能覆盖它不是拉网址。所以我认为你得到的最接近的是这样的:
$ 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
您正在将推送网址设置为no-pushing
,只要您的工作目录中没有同名文件夹,git将无法找到。你实际上是强迫git使用一个不存在的位置。
答案 1 :(得分:8)
除了将推送网址更改为无效的网址(例如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
。
答案 2 :(得分:4)
一般声明“Git将拒绝推送到非裸存储库”并非如此。如果您尝试推送与远程存储库的签出工作目录位于同一分支上的更改,Git将仅拒绝推送到非裸的远程存储库。
这个答案给出了一个简单的解释:https://stackoverflow.com/a/2933656/1866402
(我将此作为答案添加,因为我还没有足够的声誉来添加评论)
答案 3 :(得分:1)
如果您已经设置了远程设置,并且只是想防止自己意外地将其直接推入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
,它会正常工作。
答案 4 :(得分:0)
如果您可以控制存储库,则可以通过使用权限来实现此目的。获取存储库的用户不应该对主存储库具有写入权限。