从git子树获取上游分支

3
在尝试使用git子树找出良好工作流程时,我想跟踪上游分支(通常不同于master),以便在添加git子树时使用。更具体地说,假设您定义了以下远程并用它们进行了提取:
  $> 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

???

2个回答

7

简短的回答是否定的。

然而,我正在认真考虑向git做出贡献,使子树将其最后一次推送/拉取目标写入配置文件。

现在,你可以通过编写git钩子来进行类似的黑客攻击,保存使用了哪个存储库,并编写一个包装命令来使用保存的值。

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

与子模块不同,子树不需要任何特殊结构(如.gitmodule文件或gitlinks)存在于您的存储库中,并且不会强制要求您的存储库的最终用户执行任何特殊操作或理解子树的工作原理。 参考:git-subtree.txt

我认为这很好,不需要配置即可设置代码,但同时,拥有一个配置文件也不会有害,只是为了为使用较少参数运行命令提供有意义的默认值。

我目前正在实现 tortoisegit的子树支持,并且遇到了同样的问题。我希望能够在选择对文件夹进行子树推送或拉取时记住该文件夹上次推送或拉取的位置。目前我让tortoisegit写入配置文件,但实际上应该在核心命令中完成。请参见此处的拉取请求讨论。

你曾经为TortoiseGit做出过贡献(完成)吗? - T.Todua

5
< p> 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 提交映射到远程引用时,才能这样做!不幸的是,您无法可靠地执行此操作,因为提交可能是多个远程refspec的祖先。

但是您可以简单地将必要的元数据作为前缀的一部分保留。只需执行以下操作:

$ 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 后无需获取,标志会在添加远程仓库时自动处理。


是的,确实,我添加了额外的安全措施,因为我使用中间延迟大于1小时运行这两个命令。 - Sebastien Varrette
是的,将分支分离到单独的存储库中的想法可能是保持分支使用信息“可见”的最简单方法。 - Sebastien Varrette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接