如何推送到git子树



我在git上添加了一个子树,它似乎正在工作。我进入目录,做了一些更改,然后按。

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

我尝试了git subtree push,它返回:

您必须提供--prefix选项。

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

您必须提供<repository> <ref>

将更改推送到我的git子树的原始repo的正确方法是什么?

编辑:有人建议我这样做:

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

当我运行上面的程序时,它开始了这个过程,但最后说分支落后了。所以我运行:

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

返回"已更新">

因此,通过与@PhilipKirkbride的共同努力,我们成功地解决了以下问题:

你需要把所有的细节放在命令中:

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

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

使用Git 2.32(2021年第二季度),Dan 2017年的答案可以应用于任何提交,而不仅仅是HEAD。

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

subtree:push:允许指定HEAD以外的本地rev

签字人:Luke Shumaker

git subtree split允许您指定除HEAD之外的版本
'git push'(man)允许您指定本地事物和远程引用之间的映射

因此,将它们粉碎在一起,使用git-subtree-push可以指定在哪个本地对象上运行拆分,并将拆分结果推送给远程引用

git subtree手册页现在包括:

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

使用<local-commit>的子树执行"split",然后执行"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上工作。

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

subtree:修复GIT_EXEC_PATH健全性检查以在Windows上工作

签字人:Johannes Schindelin

在22d5507("subtree:不要对PATH大惊小怪",2021-04-27,Git v2.32.0-rc0——第15批中列出的merge)中,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实用程序,这种构造是不可移植的
然而,在实践中这并不重要,因为我们仍然首先查看$GIT_EXEC_PREFIX是否与$PATH的第一个组件相同
这将为我们提供预期的结果,但在Git for Windows中除外,而Git for Windows自己的Bash处理-ef运算符。

如果确实需要显示错误消息正在一个不支持-ef的shell中运行,我们只需抑制该部分的错误输出。

这修复了git-for-windows/git问题3260


使用Git 2.35(2022年第一季度),git subtree(在contrib/中)更快。

参见James Limbouris提交的3ce8888(2021年12月8日)(jamesl-dm)
(由Junio C Hamano合并——gitster——于2022年1月10日提交9b6ed10)

subtree:修复check_parents中的参数处理

签字人:James Limbouris

315a84f("subtree:在重新加入之前使用提交进行拆分",2018-09-28,Git v2.20.0-rc0——第6批中列出的merge)将check_parents的签名从"check_parents[RREV…]"更改为"check_parentsPARENTS_EXPRINDENT">
换句话说,父修订的变量列表变成了嵌入字符串中的列表
但是,在将列表发送到cache_miss,之前,它忽略了再次解压缩列表,导致无论何时出现多个父级,都会进行不正确的调用
每当处理合并提交时,都会出现这种情况,最终结果是由于不必要的重新检查而导致性能损失。

indent参数随后在e9525a8中被删除("subtree:have$indent actual impact indentation",2021-04-27,Git v2.32.0-rc0——第15批中列出的merge),但参数处理错误仍然存在。

为了保持一致性,在check_parents中取多个参数,并将所有参数分别传递给cache_miss

通常输出目录,如distpublic在.gitignore中被忽略。如果你想在这些路径上使用git subtree,你必须

git add <DIR to be subtree pushed>

然后是CCD_ 58。

完成以上两个步骤后,您可以将生成的目录git subtree push放到存储库的单独分支中。

最新更新