Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git中丢失的标记_Git_Maven_Maven Release Plugin_Git Tag - Fatal编程技术网

git中丢失的标记

git中丢失的标记,git,maven,maven-release-plugin,git-tag,Git,Maven,Maven Release Plugin,Git Tag,在使用maven发布插件时,我面临git标签的问题。我们已经在mvn发布期间关闭了自动推送git:perform(执行),并执行以下操作以构建一个新版本: 从远程git repo获取最新更改 mvn发布:准备 mvn发布:执行 git推送原始主机 git推送--tags 这个场景可以工作,提交被标记,一切都很好。但是,在这种情况下,标签会丢失: 从远程git repo获取最新更改 mvn发布:准备 有人推了主人一个承诺 mvn发布:执行 git-push-origin-master——不起作用,

在使用maven发布插件时,我面临git标签的问题。我们已经在mvn发布期间关闭了自动推送git:perform(执行),并执行以下操作以构建一个新版本:

  • 从远程git repo获取最新更改
  • mvn发布:准备
  • mvn发布:执行
  • git推送原始主机
  • git推送--tags
  • 这个场景可以工作,提交被标记,一切都很好。但是,在这种情况下,标签会丢失:

  • 从远程git repo获取最新更改
  • mvn发布:准备
  • 有人推了主人一个承诺
  • mvn发布:执行
  • git-push-origin-master
    ——不起作用,因为新提交已在,所以
  • git-pull——重新设置原始主机的基础
  • git推送原始主机
  • git推送--tags
  • Git声明已经推送了新的标记,但是除了我(构建者)以外的任何人都不能使用它们,在使用
    gitk
    时它们也不可见,因此在所有实际应用中,标记都会丢失


    这是git中的一个bug,还是一个使用错误(我们的责任是确保在构建时没有提交)?

    这是一个使用错误。标记引用由其SHA1哈希标识的特定提交。你打字的时候

    git pull --rebase origin master
    
    您正在重写历史记录,以便本地更改建立在远程
    主分支的新状态上。您标记的提交不再存在于此历史记录中,尽管通过使用
    gitk--all
    ,您应该能够看到它们仍然存在于本地存储库中的替代历史记录中


    有一个
    master
    分支直接用于标记发布,并为多个开发人员的推式提交打开,这可能是一个错误。您可以为每个版本创建一个新分支,如中所示。

    这是一个使用错误。标记引用由其SHA1哈希标识的特定提交。你打字的时候

    git pull --rebase origin master
    
    您正在重写历史记录,以便本地更改建立在远程
    主分支的新状态上。您标记的提交不再存在于此历史记录中,尽管通过使用
    gitk--all
    ,您应该能够看到它们仍然存在于本地存储库中的替代历史记录中


    有一个
    master
    分支直接用于标记发布,并为多个开发人员的推式提交打开,这可能是一个错误。您可以为每个版本创建一个新的分支,如中所示。

    正如在另一个答案中所说的,rebase正在混乱历史,因此标记不再位于它们应该位于的位置

    现在,我可以通过以下方式获得标签:

    删除本地git标记:
    git标签-d nameoftag

    删除远程git标记(我已经推过):
    git推送源:refs/tags/nameoftag

    现在在正确的位置创建一个新标记:
    git-tag-nameoftag-HEAD
    (HEAD可以替换为sha-id)

    最后,推送标签:
    gitpush--tags


    现在,其他人可以享受缺失的标签,但对于未来,我想我只会发送一封我正在构建的发布电子邮件,警告任何推东西的人都会有可怕的后果。

    正如另一个答案中所说的那样,重基正在混乱历史,因此标签不再是它们应该出现的地方

    现在,我可以通过以下方式获得标签:

    删除本地git标记:
    git标签-d nameoftag

    删除远程git标记(我已经推过):
    git推送源:refs/tags/nameoftag

    现在在正确的位置创建一个新标记:
    git-tag-nameoftag-HEAD
    (HEAD可以替换为sha-id)

    最后,推送标签:
    gitpush--tags


    现在,其他人可以享受缺少的标签,但对于未来,我想我只会发送一封我正在构建的发布电子邮件,警告推东西的人会有可怕的后果。

    正如其他人已经指出的,问题是标签在重新设置基础后不会自动更新以指向新的提交ID

    避免这种情况的一个简单方法是使用merge而不是rebase。然后您的提交将不会被修改,标记仍然指向正确的提交

    对于您的间接问题:其他人没有“看到”旧标记的原因是,默认情况下,Git仅在可以从已获取的提交(例如,在已获取的分支上)访问标记时才会获取标记。要获取所有标记,请使用以下命令:

    git fetch --tags
    

    这将获得标记,但它们仍将指向旧的(在重新基址之前)提交。

    正如其他人已经指出的,问题是在重新基址之后,标记不会自动更新以指向新的提交ID

    避免这种情况的一个简单方法是使用merge而不是rebase。然后您的提交将不会被修改,标记仍然指向正确的提交

    对于您的间接问题:其他人没有“看到”旧标记的原因是,默认情况下,Git仅在可以从已获取的提交(例如,在已获取的分支上)访问标记时才会获取标记。要获取所有标记,请使用以下命令:

    git fetch --tags
    

    这将获得标记,但它们仍将指向旧的(在重新基化之前)提交。

    在发布阶段,一旦有人将提交推送到master,有没有办法避免这种情况发生?或者向所有人发送电子邮件警告他们不要推送任何东西是唯一的方法吗?根据我编辑的答案,我建议不要使用master分支来标记发布,至少如果有几个人可以推送的话。我不使用Maven,因此无法在当前方案中真正说明如何解决这一问题。是否可以在本地删除标记,并在重定基址后重新运行Maven命令?一旦有人将commit推送到maste,有没有办法避免这种情况发生