在尝试使用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
???
答案 0 :(得分:4)
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
之后获取,标志在添加远程时负责。
子>
答案 1 :(得分:3)
简短的回答是否定的。
但是,我正在认真考虑使用git来使子树将最后的推/拉目标写入配置文件。
你现在可以通过编写一个git hook来执行类似的hack,它会保存使用的存储库,并编写一个使用保存值的包装器命令。
子树文档有点缺乏配置文件,声明如下:
与子模块不同,子树不需要任何特殊结构 (如.gitmodule文件或gitlinks)存在于您的存储库中,并且 不要强迫您的存储库的最终用户执行任何特殊操作或操作 了解如何使用子树 工作。 Reference: git-subtree.txt
我觉得很高兴不需要配置来设置代码,但与此同时,让一个只提供有意义的默认值来运行命令并不会有什么坏处。参数。
我目前正在实施subtree support for tortoisegit,而且我遇到了同样的问题。我想在你选择子树推送或拉动文件夹时这样做,它可以记住上次推送或拉出该文件夹的位置。现在我有tortoisegit写入配置文件,但它确实应该在核心命令上完成。See the pull request discussion here.