从git子树获取上游分支

从git子树获取上游分支,git,git-subtree,Git,Git Subtree,在尝试使用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

在尝试使用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子树来跟踪远程
easybuild easyblocks
的上游分支
develop
(远程
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子树pull--prefix--squash
简而言之,答案是否定的

然而,我正在认真考虑对git进行修改,使子树将其最后的推/拉目标写入配置文件

现在,您可以编写一个git钩子(保存使用的存储库)并编写一个使用保存的值的包装器命令来进行类似的攻击

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

与子模块不同,子树不需要任何特殊构造 (如.gitmodule文件或gitlinks)出现在您的存储库中,并且 不要强迫存储库的最终用户执行任何特殊操作或 了解子树是如何 工作

我认为不需要配置就可以获得代码设置,这很好,但同时,有一个配置可以提供有意义的默认值,以便以较少的参数运行命令,也不会有什么坏处


我目前正在实施,我面临着同样的问题。我希望这样,当您选择对文件夹执行子树推送或拉送时,它可以记住上次推送或拉送文件夹的位置。目前,我正在让Ortoisegit写入配置文件,但实际上应该在core命令上完成。

git子树对命令的作用是为表示远程refspec的压缩提交创建合并提交

commit 05005a1
    Merge: a0d3141 9fcc10b    
    Merge commit '9fcc10b' as 'easybuild/easyblocks'
如果您跟踪并查找提交
9fcc10b
,您将看到有元数据
git子树
记录在该提交中,但它不足以满足您的要求:

commit 9fcc10b
    Squashed 'easybuild/easyblocks/' content from commit c2cceae
    git-subtree-dir: easybuild/easyblocks
    git-subtree-split: c2cceae
因此,只有当您能够解析提交消息并将
c2cceae
commit映射到远程引用时!遗憾的是,您无法可靠地做到这一点,因为提交可以是多个远程refspec的祖先

不过您可以做的就是将必要的元数据作为前缀的一部分保留下来。只要做:

$ git subtree add --prefix easybuild-easyblocks/develop \
      --squash easybuild-easyblocks/develop
这很有意义,因为您不是将回购添加为子树,而是将远程分支添加为子树,因此请将分支名称保留在工作树中。您将能够简单地执行以下操作:

$ git subtree pull --prefix easybuild-easyblocks/develop \
      --squash easybuild-easyblocks/develop
前缀是目标回购/参考规范的精确副本


无需在git add remote–f之后进行提取,在添加远程设备时,该标志会处理该问题。

是的,事实上,我添加它是为了额外的安全性,因为我以中间延迟运行这两个命令>1hyes,将分支分离到单独的存储库可能是保存所用分支的“可见”信息的最简单方法。
$ git subtree pull --prefix easybuild-easyblocks/develop \
      --squash easybuild-easyblocks/develop