如何使 git 分支的上游引用为只读?

Posted

技术标签:

【中文标题】如何使 git 分支的上游引用为只读?【英文标题】:How do I make a git branch's upstream reference be read-only? 【发布时间】:2012-04-06 08:25:02 【问题描述】:

我如何告诉 git,虽然我想在某些分支上允许“git fetch”,但我不想在这些分支上允许“git push”。

换句话说,我有一些反映“当前工作”的分支,我想将它们推送到我的上游存储库。但是我有其他分支(包括 master),我打算在本地存储库的上下文中反映“其他工作”,我不想从这里踩到这些分支。

这是我的远程存储库,在其他情况下,我希望能够推送到它的所有分支。但不是来自这个特定的本地实例。

我认为这是可能的,因为 git remote show origin 有时告诉我,我已经为“git pull”配置了分支,但没有为“git push”配置分支。但是我对配置文件的理解不够好,无法手动创建这种效果,而且我对 git 的命令行语言也不太了解,无法在那里进行操作。

现在,我能做的最好的事情就是确保我的本地副本对于我想要保持原始状态的上游分支来说已经过时了。 (另外,在我的 git push 命令行中明确指定接收分支——指定我只想推送到与本地签出分支相对应的远程实例中——防止推送到不需要的分支。但我想消除这种复杂性.)

【问题讨论】:

Prohibit remote pushing to the master branch in git 的可能重复项 看起来在接收存储库上设置 receive.denycurrentbranch 的分辨率。但我正在寻找对传输存储库的控制权。 您可以设置push.default = upstream,然后git push 将在没有其他参数的情况下仅推送本地签出分支。这看起来是 git 下一版本中的默认行为。 我需要特定版本的 git 才能使用它吗?我尝试了 git config --add push.default 上游但是当我尝试更改时,我得到:$ git add READMEerror: Malformed value for push.default: upstreamerror: Must be one of nothing, matching, tracking or current. (无论如何,我不完全确定上游是做什么的,但看起来 push.default = tracking 对我来说是正确的:如果我没有在本地声明上游分支正在跟踪我的本地分支,我不能使用裸露的 'git push' 传播到它。) 【参考方案1】:

类似于 Borealid 在 cmets 中所说的,在您的本地副本中,您应该设置 git config push.default upstream,然后另外确保那些您不希望能够推送的分支没有分配上游分支.有一个git branch --set-upstream 命令,但是这不会让您设置一个空的上游配置来删除它,因此您必须手动编辑您的 .git/config 文件并从部分中删除 merge = refs/heads/* 行对应的分支。

【讨论】:

【参考方案2】:

实际上,看起来 push.default = current 会做我想做的事。

这并不是我所要求的,但它“足够好”。而且它的优点是简单。

简单是一种美德——让理解和使用系统变得简单。

它也非常模仿我认为我从 git pull 看到的行为。

【讨论】:

引用git help config:“跟踪 - 不推荐使用的上游同义词。”。 好的,这是从哪个版本开始的? (为什么要破坏现有的文档等等?)

以上是关于如何使 git 分支的上游引用为只读?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Git 中删除无效的远程分支引用?

git-如何同步上游服务的分支

git-如何同步上游服务的分支

git-如何同步上游服务的分支

git 命令使一个分支像另一个分支

当远程分支在 Git 中重命名时,如何更新我的本地引用?