Git:设置一个只提取的遥控器?

mtb*_*ave 116 git workflow

当我git remote -v在我的一个配置了远程的Git存储库中运行时,我看到每个远程都有fetch和push规范:

$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)
Run Code Online (Sandbox Code Playgroud)

对于指向同行开发人员的遥控器,没有必要推送,Git无论如何都会拒绝推送到非裸机库.有没有办法将这些遥控器配置为"仅提取"而没有推送地址或功能?

Dan*_*man 172

我不认为您可以删除推送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
Run Code Online (Sandbox Code Playgroud)

您正在设置推送URL no-pushing,只要您的工作目录中没有相同名称的文件夹,git将无法找到.你基本上是强迫git使用一个不存在的位置.

  • 是的,你会认为"git remote set-url --delete --push.*"可以解决这个问题,但是如果你删除了push url,那么它会默认返回到fetch url. (13认同)
  • 我个人更喜欢使用像'**DISALLOWED**'这样的东西,更加明显.但那只是品味问题. (5认同)
  • 与@Pierre-OlivierVares 类似,我使用了 `git remote set-url --push origin -- --read-only--` -- 注意额外的 `--` 以允许名称带有前导破折号。这对我来说更具可读性。 (3认同)
  • 我发现使用 Git 2.24.0 我必须使用 DO.NOT.PUSH 来避免“错误:存储库 no-pushing/REPO 不存在”。 (2认同)

Rod*_*lho 11

除了将推送URL更改为无效的内容(例如,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 '...'
Run Code Online (Sandbox Code Playgroud)

如果需要,使用钩子可以更精细地控制推动.有关.git/hooks/pre-push.sample如何防止推送正在进行的提交的示例,请参阅参考资料.


pke*_*ler 6

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

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

(我将其添加为答案,因为我还没有足够的声誉来添加评论)