在Git中,当我将本地分支推送到远程分支时,如何将它们配置为具有前缀?

在Git中,当我将本地分支推送到远程分支时,如何将它们配置为具有前缀?,git,Git,我所在的团队有一个分支命名标准,该标准要求在中央git存储库中为分支指定一个特定前缀。该前缀如下: dev/<name>/<topic> 在本地,出于理智的原因,我不想处理前缀。这是使键入命令更加乏味的样板文件。相反,我希望我的本地分支只是,在上面的示例中,它只是我的功能 我想看看我可以构建什么样的推送和获取工作流,以使前缀尽可能透明。首先,让我分享一些我目前在全局.gitconfig中设置的有趣的配置选项: [push] default = current [

我所在的团队有一个分支命名标准,该标准要求在中央git存储库中为分支指定一个特定前缀。该前缀如下:

dev/<name>/<topic>
在本地,出于理智的原因,我不想处理前缀。这是使键入命令更加乏味的样板文件。相反,我希望我的本地分支只是
,在上面的示例中,它只是
我的功能

我想看看我可以构建什么样的推送和获取工作流,以使前缀尽可能透明。首先,让我分享一些我目前在全局
.gitconfig
中设置的有趣的配置选项:

[push]
    default = current
[remote]
    pushDefault = fork
远程特定的设置在这里可能并不重要,但为了完整起见,我将其包括在内。我想支持三种不同的用例:

  • 当我获取包含
    dev/john
    前缀的远程分支时,我希望它们在本地出现在
    refs/remotes/origin/
    下。例如,远程分支
    refs/heads/dev/john/my feature
    应在本地获取到
    refs/remotes/origin/my feature
  • 当我将本地分支
    refs/heads/my feature
    推到远程
    origin
    时,它应该映射到远程上的
    refs/heads/dev/john/my feature
  • 当我按下
    refs/heads/master
    时,它仍应转到遥控器上的
    refs/heads/master
    master
    分支应完全忽略前缀
  • 这是我的repo的
    .git/config
    中的
    origin
    的远程配置。注意,我现在只测试了
    gitpush
    ,我意识到fetchrefspec不支持上面的第一个用例

    [remote "origin"]
        url = git@mydomain:myrepo
        fetch = +refs/heads/dev/john/*:refs/remotes/origin/*
        fetch = +refs/heads/*:refs/remotes/origin/*
        push = refs/heads/master:refs/heads/master
        push = refs/heads/*:refs/heads/dev/john/*
    
    以下是我迄今为止观察到的情况:

  • git-fetch-origin
    到目前为止在所有情况下都有效:在
    refs/heads/dev/john/
    下的分支映射到
    refs/heads/origin/
    。其他一切都是我们都习惯的法线直接映射
  • 执行一个
    git push-n origin master
    产生了预期的结果
  • 执行一个
    git push-n origin my feature
    产生了预期的结果。具体而言:

    • [新分支]我的功能->dev/john/my功能
  • 签出名为
    my feature
    的本地分支后,命令
    git push-n origin
    push不尊重
    push.default
    ,而是推送所有本地分支。我的期望是,如果
    remote.origin.push
    设置在refspec中包含通配符,则仍然使用
    push.default
    。在没有指定源分支的情况下,我希望它仍然假设我正在推送当前分支,但只是将其映射到另一个远程引用

  • 从我所读到的内容来看,文档不支持我为
    git push-n origin
    案例断言的行为。具体来说,[git push]文档说(我的重点):

    当命令行没有指定使用
    ..
    参数或
    --all
    --mirror
    --tags
    选项推送的内容时,命令会通过查阅
    remote.*来查找默认的
    。推送
    配置,,如果找不到它,接受推送。默认配置决定推送的内容


    因此,我想,所有这些最终都是一个很长的问题:我如何使
    git push-n origin
    在给定的配置下给我与
    git push-n origin相同的行为我的特性(注意配置本身的更改是可以接受的)

    你做到了吗?我需要同样的,但没有叉子。
    [remote "origin"]
        url = git@mydomain:myrepo
        fetch = +refs/heads/dev/john/*:refs/remotes/origin/*
        fetch = +refs/heads/*:refs/remotes/origin/*
        push = refs/heads/master:refs/heads/master
        push = refs/heads/*:refs/heads/dev/john/*