【问题标题】:Get the upstream branch from a git subtree从 git 子树获取上游分支
【发布时间】:2014-03-18 16:43:02
【问题描述】:

在尝试使用 git 子树找出一个好的工作流程时,我想跟踪添加 git 子树时使用的上游分支(通常不同于 master)。

更具体地说,假设您定义了以下遥控器并用于获取它们:

  $> git remote add -f easybuild-easyblocks https://github.com/ULHPC/easybuild-easyblocks.git
  $> git remote add -f easybuild-easyconfigs https://github.com/ULHPC/easybuild-easyconfigs.git
  $> git fetch easybuild-easyblocks
  $> git fetch easybuild-easyconfigs 

可以看到不同的远程分支:

  $> git show-ref | grep -v tags | grep easybuild
  f4b4752bcadd5dd44aa74ee03f4bd19b75810bdb refs/remotes/easybuild-easyblocks/develop
  49a1e893160c6c1d2ad50109265e55586c377c1e refs/remotes/easybuild-easyblocks/master
  173aa5cabddf998e2ad672135752a33875095f8b refs/remotes/easybuild-easyblocks/v1.8.x
  49a1e893160c6c1d2ad50109265e55586c377c1e refs/remotes/easybuild-easyblocks/v1.9.x
  770c5246667d7741c02d4e1f4d4a50fb8cd3fcbe refs/remotes/easybuild-easyconfigs/develop
  d8422c6f7aace405f1089f178edabb9316629d4b refs/remotes/easybuild-easyconfigs/master
  5f3be9e2d5cbb2844ebf74ede15e2c30a8b12705 refs/remotes/easybuild-easyconfigs/uni.lu
  0382ff527360f1baa192bb92597552cc379bba68 refs/remotes/easybuild-easyconfigs/v1.8.0.x
  d8422c6f7aace405f1089f178edabb9316629d4b refs/remotes/easybuild-easyconfigs/v1.9.x

现在假设您定义了两个新的 git 子树来跟踪上游分支 develop 用于远程 easybuild-easyblocks(分别为 v1.8.0.x 用于远程 easybuild-easyconfigs):

  $> git subtree add --prefix easybuild/easyblocks  --squash easybuild-easyblocks/develop
  $> git subtree add --prefix easybuild/easyconfigs --squash easybuild-easyconfigs/v1.8.0.x

您以干净的目录布局结束,其中easybuild/* 在单独的目录中保存相应存储库的最新版本。

我现在可以通过运行检查所有分支的头部提交哈希:

 $> git branch -v -r --abbrev=40                                                                                                                                                                                                                                                 
 easybuild-easyblocks/develop   f4b4752bcadd5dd44aa74ee03f4bd19b75810bdb Merge pull request #314 from boegel/version_bump
 easybuild-easyblocks/master    49a1e893160c6c1d2ad50109265e55586c377c1e Merge pull request #312 from hpcugent/develop
 easybuild-easyblocks/v1.8.x    173aa5cabddf998e2ad672135752a33875095f8b Merge pull request #281 from boegel/1.8.2_release_notes
 easybuild-easyblocks/v1.9.x    49a1e893160c6c1d2ad50109265e55586c377c1e Merge pull request #312 from hpcugent/develop
 easybuild-easyconfigs/develop  770c5246667d7741c02d4e1f4d4a50fb8cd3fcbe Merge pull request #500 from fgeorgatos/contrib_qtop
 easybuild-easyconfigs/master   d8422c6f7aace405f1089f178edabb9316629d4b Merge pull request #544 from hpcugent/develop
 easybuild-easyconfigs/uni.lu   5f3be9e2d5cbb2844ebf74ede15e2c30a8b12705 add Allinea-4.2-34164-Ubuntu-10.04-x86_64.eb
 easybuild-easyconfigs/v1.8.0.x 0382ff527360f1baa192bb92597552cc379bba68 Merge pull request #473 from boegel/v1.8.0.x
 easybuild-easyconfigs/v1.9.x   d8422c6f7aace405f1089f178edabb9316629d4b Merge pull request #544 from hpcugent/develop

现在我希望从子树中提取最新的更改。因此我运行:

 $>git fetch easybuild-easyblocks    # fetch latest changes of the remote before merging
 $> git subtree pull --prefix easybuild/easyblocks easybuild-easyblocks develop --squash

 $> git fetch easybuild-easyconfigs
 $> git subtree pull --prefix easybuild/easyconfigs easybuild-easyconfigs v1.8.0.x--squash

是否有一种简单的方法来猜测/检查已用于设置子树的上游分支,以便我可以按照以下格式制作通用命令:

   git subtree pull --prefix <path/to/subtree> <subtree-remote> <subtree-branch> --squash

???

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

    简短的回答是否定的。

    但是,我正在认真考虑为 git 做出贡献,以使子树将其最后的推/拉目标写入配置文件。

    您现在可以通过编写一个 git 钩子来进行类似的 hack,它保存使用的存储库,并编写一个使用保存的值的包装器命令。

    子树文档有点吹嘘它缺少配置文件,声明如下:

    与子模块不同,子树不需要任何特殊结构 (如 .gitmodule 文件或 gitlinks)存在于您的存储库中,并且 不要强迫存储库的最终用户做任何特别的事情或 了解子树如何 工作。 Reference: git-subtree.txt

    我认为无需配置即可获得代码设置,这很好,但与此同时,只需提供有意义的默认值以使用更少的参数运行命令,这并没有什么坏处。

    我目前正在实施subtree support for tortoisegit,我也遇到了同样的问题。我想这样做,所以当您选择对文件夹进行子树推送或拉取时,它可以记住该文件夹最后一次推送或拉出的位置。现在我正在让 tortoisegit 写入配置文件,但它确实应该在核心命令上完成。See the pull request discussion here.

    【讨论】:

    • 你曾经为 TortoiseGit 贡献过(完成)吗?
    【解决方案2】:

    git-subtree 对您的命令所做的是为代表远程 refspec 的压缩提交创建合并提交。

    commit 05005a1
        Merge: a0d3141 9fcc10b    
        Merge commit '9fcc10b' as 'easybuild/easyblocks'
    

    如果您跟进并查找提交 9fcc10b,您将看到 git-subtree 在该提交中记录的元数据,但这不足以满足您的需求:

    commit 9fcc10b
        Squashed 'easybuild/easyblocks/' content from commit c2cceae
        git-subtree-dir: easybuild/easyblocks
        git-subtree-split: c2cceae
    

    因此,只有当您可以解析提交消息并将c2cceae 提交映射到远程引用时...!唉,你不能可靠地做到这一点,因为提交可以是多个远程 refspecs 的祖先。

    您可以做的只是将必要的元数据保留为前缀的一部分。做吧:

    $ git subtree add --prefix easybuild-easyblocks/develop \
          --squash easybuild-easyblocks/develop
    

    这很有意义,因为您没有将 repo 添加为子树,而是将远程分支添加为子树,因此请在工作树中保留分支名称。您将能够简单地做到:

    $ git subtree pull --prefix easybuild-easyblocks/develop \
          --squash easybuild-easyblocks/develop
    

    前缀是目标repo/refspec的精确副本。


    git add remote –f 之后不需要获取,该标志会在添加遥控器时处理。

    【讨论】:

    • 是的,确实,我添加它是为了提高安全性,因为我运行这两个命令的中间延迟 > 1h
    • 是的,将分支分离到单独的存储库中的想法可能是保持“可见”所用分支信息的最简单方法。
    猜你喜欢
    • 2013-03-21
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2013-10-12
    • 2018-03-12
    • 2021-08-09
    相关资源
    最近更新 更多