【问题标题】:Git: When push a signle tag to remote, how can I push the branch containing this tag as well?Git:将单个标签推送到远程时,如何推送包含该标签的分支?
【发布时间】:2017-07-12 03:12:58
【问题描述】:

使用git push origin <tag_name>可以将标签推送到远程服务器,如This Question所示。但是,如果包含此标签的本地分支在远程服务器之前,则此推送操作将创建一个包含此标签的匿名分支。

当其他开发人员尝试获取它时,什么也没有发生。 (不会获取匿名分支!?)

因此,问题是: 当我想要推送标签时,如何推送分支(更好地只针对标签)?

由于我还不确定是否推送分支的所有历史(但肯定会推送到标签的点,因为我要推送标签),所以只推送分支到点更方便标签。

有什么解决办法吗?

【问题讨论】:

  • 听起来你想在当前标签处create a branch(可能与标签同名)并推送那个分支?
  • 推送包含标签的分支没有意义,因为多个分支可能包含其历史记录中标签所引用的提交。
  • 嗯,应该没问题。只要已经推送了一个包含标签的分支,就不会创建匿名分支。问题将被细化为:当没有包含标签的分支时,我们希望至少有一个包含该标签的分支(通常是当前分支)也被推送。或者更好:如果找到这种情况,并且当前分支不包含这个标签,则报错。

标签: git


【解决方案1】:

默认情况下,git fetch(或git pull)不获取标签。

如果你想获取远程标签:git fetch --tags

【讨论】:

    【解决方案2】:

    当其他开发人员尝试获取它时,什么也没有发生。 (不会获取匿名分支!?)

    匿名分支是有问题的。 Git 的一部分认为它们是分支,而部分则不是。如果它们确实存在,那么每个提交都是它自己的匿名分支。1 对于大多数目的来说,考虑选择一个提交可能更好,也可以不选择它的部分或全部祖先。选择提交bacacab without ancestry 会让你获得一个提交,选择它with ancestry 会使其表现得像一个匿名分支。

    在任何情况下,git fetch 始终不变地复制的内容——因为它必须——由提交对象本身及其引用的内容组成:所需的任何树或 blob,以及所需的任何早期提交。2 对于带注释的标签对象,Git 复制标签对象本身不变,并将标签的目标对象添加到所需的对象集中(如果不存在则复制)。 如何找到这些对象ID是由另一个Git提供的名称——任何引用名称,而不仅仅是分支或标签名称——你的Git正在获取的那个来自。所以这意味着必须有一个名字。但这是 other Git 中的名称,在另一个存储库中; 您的 存储库中使用的名称(如果有)由您控制。

    事实证明,如果 Git 只获取一个标签名称,并且没有被指示显式复制标签名称,那么它根本无法写入任何内容(FETCH_HEAD 除外)文件)在某些情况下。请参阅my answerWhy is git fetch not fetching any tags? 简而言之,不过,如果您使用git fetch --tags,您将获得他们的(另一个 Git 的)标签名称复制到您自己的存储库中的同名标签,然后您可以使用该标签名称来查找提交(及其祖先)。


    1就此而言,单个提交可能是无限数量的匿名分支的提示提交。谁说缺少名字是否与第二个缺少名字相同?显然,以提交 dadf00d 结尾的匿名分支与以 bl00de1f 结尾的匿名分支不同,因此 no-name 肯定与 no-name 不匹配。那么为什么ac0ffee 的无名匹配ac0ffee 的无名呢? (这是一个修辞/哲学问题,旨在让人们思考 Git 中提交和分支名称的性质,而不是得到一个具体的答案——尽管我确实有自己的具体答案。:-))

    2这确实会针对浅层克隆进行修改。在这里,提交被复制到某个“深度”值,然后 Git 插入一个浅嫁接,人为地假装提交没有父母(通过将提交 ID 写入.git/shallow)。但是提交实际上是原封不动地复制的;它只是被截断的图形行走。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 2018-12-22
      • 2016-07-19
      • 2011-07-08
      • 1970-01-01
      • 2011-09-10
      • 2016-07-08
      • 2011-10-15
      相关资源
      最近更新 更多