如何推送到Git子树?

27

我在git上添加了一个子树,看起来它正在工作。 我进入目录并进行了一些更改,然后推送。

我注意到这些更改出现在父项目中,但我用作源的存储库尚未更新。

我尝试使用git subtree push,返回:

您必须提供--prefix选项。

还有git subtree push --prefix=my/folder git@mygitrepo.com,返回:

必须提供<repository> <ref>

推送对于我的git子树来说正确的方法是什么?

编辑:建议我执行以下操作:

git subtree push --prefix=my/folder origin master

当我运行上面的代码时,它开始了进程但最终显示该分支落后。因此我运行:

git subtree pull --prefix=my/folder origin master

返回 "已经是最新的"


哎呀,我想到的是子模块(我已经使用过)而不是子树(我没有使用过)。 - crashmstr
@PhilipKirkbride好的,那么也提供一下这个命令吧:git subtree push --prefix=my/folder origin master - Dan
@Dan 谢谢,这让我有了进一步的了解。我在我的问题中做了一个编辑,发布了结果。 - Philip Kirkbride
@Dan 我运行了 push,它说我的代码库落后了,所以我运行了 pull,结果显示已经是最新的了。 - Philip Kirkbride
@Dan 我希望有一个“git subtree log”命令。 - Philip Kirkbride
显示剩余7条评论
3个回答

33

所以,在与@PhilipKirkbride的共同努力下,我们成功地找出了以下内容:

您需要在命令中放入所有细节:

git subtree push --prefix=my/folder subtree_origin master

其中master是子树中的分支,而subtree_origin只是另一个远程仓库,恰好指向您的子树Git存储库。您也可以键入完整的存储库URL。


0

随着Git 2.32 (2021年第二季度)的到来,在2017年提出的答案现在可以应用于任何提交,而不仅仅是HEAD。

查看提交 9a3e3ca, 提交 49470cd, 提交 94389e7, 提交 cb65514, 提交 6468784, 提交 e9525a8, 提交 534ff90, 提交 5cdae0f, 提交 cbb5de8, 提交 e4f8baa, 提交 bbffb02, 提交 22d5507, 提交 a94f911, 提交 e2b11e4, 提交 6d43585, 提交 f664304, 提交 8dc3240, 提交 d2f0f81, 提交 5a35697, 提交 b04538d, 提交 b269976, 提交 db6952b, 提交 f1cd2d9, 提交 63ac4f1, 提交 c4566ab, 提交 40b1e1e, 提交 f700406, 提交 f2bb7fe, 提交 914d512, 提交 4c996de (2021年4月27日) 由Luke Shumaker (LukeShu)合并。
(由Junio C Hamano -- gitster --提交 44ccb76中合并,2021年5月10日)

子树: push:允许指定本地版本而不是HEAD

签名作者:Luke Shumaker

git subtree split允许你指定一个不同于HEAD的版本。
'git push'(man) 允许你指定本地内容和远程引用之间的映射关系。

把它们结合起来,使得git子树推送可以让你指定运行分离操作的本地内容,并将该分离操作的结果推送到远程引用。

git subtree手册现在包括:

push <repository> [+][<local-commit>:]<remote-ref>

使用<local-commit>的子树进行“分离”,然后执行“git push”将结果推送到<repository><remote-ref>

这可以用于将您的子树推送到远程存储库的不同分支。
与“split”一样,如果没有给出<local-commit>,则使用HEAD。
可选的前导“+”会被忽略。

这意味着这将起作用:

git subtree push --prefix="sub dir" --annotate="*" ./"sub proj" HEAD^:from-mainline
                                                                ^^^^^^

在Git 2.33(2021年第三季度),git subtree实际上可以在Windows上工作。

请参阅提交77f37de提交f7ee88f(2021年6月14日)由Johannes Schindelin(dscho
(由Junio C Hamano -- gitster --合并于提交e22ac8b,2021年7月8日)

subtree:修复在Windows上GIT_EXEC_PATH的健全性检查问题

签名作者:Johannes Schindelin

22d5507 ("subtree: don't fuss with PATH", 2021-04-27, Git v2.32.0-rc0 -- merge listed in batch #15) 中,git子树在Windows上被彻底破坏了。
原因是它假定Unix语义,其中PATH是以冒号分隔的,并假定$GIT_EXEC_PATH:$PATH的字面前缀。 这两个都不是真的,尤其是后者,因为GIT_EXEC_PATH是Windows样式的路径,而PATH是Unix样式的路径列表。
让我们确保$GIT_EXEC_PATH$PATH的第一个组件引用不同的实体,然后才会出错。
我们通过使用命令test <path1> -ef <path2>来执行此操作,该命令验证<path1><path2>的inode是否相同。
不幸的是,根据test utility,这种结构是不可移植的。 但是,在实践中这并不重要,因为我们仍然首先查看$GIT_EXEC_PREFIX是否与$PATH的第一个组件字符串相同。 这将在Git for Windows之外的任何地方都给我们预期的结果,而Git for Windows自己的Bash确实处理-ef运算符。
以防我们确实需要显示错误消息并且正在运行不支持-ef的shell,我们只需抑制该部分的错误输出即可。
这解决了git-for-windows/git issue 3260

在 Git 2.35(2022 年第一季度)中,git subtree (位于 contrib/)的速度更快了。

请参见 提交记录 3ce8888(由 James Limbouris(jamesl-dm 于 2021 年 12 月 08 日提交)。
(由 Junio C Hamano -- gitster -- 在提交记录 9b6eda0 中合并,时间为 2022 年 01 月 10 日)

子树: 修复check_parents中的参数处理问题

签名作者: James Limbouris

315a84f ("subtree: use commits before rejoins for splits", 2018-09-28, Git v2.20.0-rc0 -- merge listed in batch #6) 更改了 check_parents 的签名,从 'check_parents [REV...]' 变为 'check_parents PARENTS_EXPR INDENT'。
换句话说,父提交的变量列表变成了嵌入字符串的列表。
然而,在将其发送到 cache_miss 之前,它忽略了再次解包列表,导致每当存在多个父项时就会出现错误调用。
这种情况发生在处理合并提交时,最终结果是性能损失,因为进行了不必要的重新检查。

随后在 e9525a8 ("subtree: have $indent actually affect indentation", 2021-04-27, Git v2.32.0-rc0 -- merge listed in batch #15) 中删除了缩进参数,但参数处理错误仍然存在。

为了保持一致性,在 check_parents 中接受多个参数,并将它们全部分别传递给 cache_miss


-1
通常情况下,输出目录(例如distpublic)会被忽略在.gitignore文件中。如果你想在这些路径上使用git subtree,你需要:
git add <DIR to be subtree pushed>

然后执行git commit命令。

完成以上两个步骤后,您就可以将生成的目录通过git subtree push命令推送到您的代码库的不同分支中了。


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