Git:设置只读远程?

当我在一个configuration了远程的Git仓库中运行git remote -v时,我发现每个远程仓库都具有提取和推送规格:

 $ git remote -v <remote-name> ssh://host/path/to/repo (fetch) <remote-name> ssh://host/path/to/repo (push) 

对于指向同行开发者的遥控器,不需要推送,Git将拒绝推到非裸仓库。 有没有什么办法可以将这些遥控器configuration为“仅提取”而没有推送地址或function?

我不认为你可以删除推送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将无法find。 你基本上是强迫git使用一个不存在的位置。

一般的说法“Git拒绝推送到非裸仓库”是不正确的。 如果您尝试推送与远程存储库签出的工作目录位于同一分支上的更改,Git将只会拒绝推送到非裸露的远程存储库。

这个答案给出了一个简单的解释: https : //stackoverflow.com/a/2933656/1866402

(我join这个答案是因为我没有足够的声望来添加评论呢)

如果您可以控制存储库,则可以通过使用权限来实现此目的。 提取存储库的用户不应具有主存储库上的写入权限。

除了将推送URL改为无效(例如, git remote set-url --push origin DISABLED pre-push 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