git subtree pull --squash bug如果之前拉出来的代码重定基了呢?

9nvpjoqh  于 2022-11-20  发布在  Git
关注(0)|答案(1)|浏览(215)

我发现git subtree pull在rebase上有一个bug,但是当我在谷歌上搜索的时候,我找不到相关的信息(事实上,关于git子树的信息并不多)。
让我首先显示我的子树设置,我有3个子树添加为3个子目录:

ws ➤ ls -d */                                                                                                                            
ccfront/  wsclient/ wsserver/
ws ➤ git remote -v                                                                                                                       
ccfront ssh://git@xxxxx/webcc/cc-frontend.git (fetch)
ccfront ssh://git@xxxxx/webcc/cc-frontend.git (push)
origin  ssh://git@xxxxx/webcc/ws_all.git (fetch)
origin  ssh://git@xxxxx/webcc/ws_all.git (push)
wsclient    ssh://git@xxxxx/webcc/bs-front.git (fetch)
wsclient    ssh://git@xxxxx/webcc/bs-front.git (push)
wsserver    ssh://git@xxxxx/webcc/ws_redis.git (fetch)
wsserver    ssh://git@xxxxx/webcc/ws_redis.git (push)

通常git subtree pull工作正常,但是我发现如果我在“parent”存储库中重定结果代码的基,然后再次运行git subtree pull以从子树中获取最新代码,git subtree pull会意外地工作。

//The result should only pull the latest code as the committed message shows 
//Squashed 'wsserver/' changes from 5e997710..1cc96493

git subtree pull --prefix=wsserver wsserver v4 --squash -m 'test'

提取的代码应为wsserver中5e997710..1cc96493之间的变更,因此仅变更了4个文件

git diff --name-only 5e997710 1cc96493
"doc/\347\242\260\345\210\260\344\270\200\344\272\233\351\227\256\351\242\230.md"
src/test/ccbackend/Pipfile
src/test/ccbackend/Pipfile-bak
src/test/ccbackend/Pipfile.lock
(END)

但是它并不像这里显示的那样。子树ccfront文件也被添加了。我不知道为什么。但是这只发生在我在“父”库中重定结果代码的时候。所以我觉得这似乎是一个bug。
有人也经历过吗?

git show --stat --name-only e5e7f5cd
commit e5e7f5cdc8e6a385fbf98788ad0f0e1994864d6a
Author: qiulang@macbook3 <qiulang2000@126.com>
Date:   Mon Apr 26 17:18:05 2021 +0800

Squashed 'wsserver/' changes from 5e997710..1cc96493

1cc96493 过去开发文档整理
18f68394 3.8
d13ece2a test

git-subtree-dir: wsserver
git-subtree-split: 1cc96493f7fac9ecb2e2fe4bf4436586345cc182

.env
.gitignore
.prettierrc
.vscode/launch.json
Dockerfile
builder.py
ccfront/.babelrc
ccfront/.dockerignore
ccfront/.editorconfig
ccfront/.env
ccfront/.eslintignore
ccfront/.eslintrc.js
ccfront/.gitignore
ccfront/.postcssrc.js
ccfront/.vscode/launch.json
ccfront/.vscode/settings.json
ccfront/Dockerfile
ccfront/README.md
"ccfront/api.js review\346\204\217\350\247\201.md"
ccfront/build/build.js
ccfront/build/check-versions.js
ccfront/build/sed.js
ccfront/build/utils.js
ccfront/build/vue-loader.conf.js
ccfront/build/webpack.base.conf.js
bweufnob

bweufnob1#

检查Git 2.39(2022年第4季度)是否仍然存在此问题:它在其分割和合并功能中包含对git subtree的错误修复。
请参见Philippe Blain ( phil-blain )commit 1762382commit 0d33067commit f10d31ccommit 7990142commit 34ab458commit 5626a9ecommit 2e94339commit a50fcc1commit 455f0ad(2022年10月21日)。
(2022年10月30日,由commit a23e0b6commit a23e0b6中合并)
第1231章:修复挤压合并带注解的标记后的挤压合并
签署人:菲利普·布兰
当调用git subtree merge --squash(man)$ref'时,无论是直接调用还是通过git subtree pull --squash(man)$repo $ref'调用,代码都会查找子树的最新squash合并,以创建新的合并提交作为前一个squash合并的子项。
该搜索在函数'process_subtree_split_trailer'中完成,由'find_latest_squash'调用,该函数查找带有'git-subtree-split'尾部的最近提交;该trailer的值是最后一次挤压合并的ref的子树库中的对象名。
该函数使用“git rev-parse”(man)验证此对象是否存在于本地,如果不存在则中止。
'git-subtree-split'尾标所指涉的杂凑保证会Map到认可,因为它是在'cmd_merge'的第一个参数上执行'git rev-parse -q --verify'(man)$1^{commit}"'的结果(这Map到' cmd_merge '中的'rev',它会传递到' new_squash_commit '和' squash_msg ')。
但这只是由于e4f8baa(“subtree:在单独的cmd_ functions中解析revs”,2021-04-27,Git v2.32.0-rc 0--merge列在batch #15中),这是Git 2.32的一个版本。
在提交之前,“cmd_merge”使用“git rev-parse --revs-only”(man)$@“”验证了为其提供的修订版本。
这样的调用,当被提供注解标记的名称时,将返回标记的散列,而不是标记所引用的提交的散列。
如果最近的squash-merge使用2.32之前版本的git subtree合并了subtree仓库中的带注解标签,这会导致squash-merge在'find_latest_squash'中失败,除非之前的带注解标签存在于本地(通常情况下不存在)。
当'git rev-parse'失败时,我们可以通过'process_subtree_split_trailer'中的哈希值直接获取对象来解决这个问题,但是为了这样做,我们需要知道子树仓库的名称或URL。
这对于git子树合并来说是不可能的,但是当它通过git子树拉调用时就很容易了,因为在这种情况下,子树仓库是由用户在命令行传递的。
通过在函数'cmd_merge','find_latest_squash'和'process_subtree_split_trailer'中添加一个可选的'repository'参数,并在'cmd_pull'中使用该'repository'参数调用'cmd_merge',允许git子树拉取场景开箱即用。
如果“process_subtree_split_trailer”中没有“repository”,请指示用户尝试直接提取缺少的对象。

相关问题