我发现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
1条答案
按热度按时间bweufnob1#
检查Git 2.39(2022年第4季度)是否仍然存在此问题:它在其分割和合并功能中包含对
git subtree
的错误修复。请参见Philippe Blain (
phil-blain
)的commit 1762382、commit 0d33067、commit f10d31c、commit 7990142、commit 34ab458、commit 5626a9e、commit 2e94339、commit a50fcc1、commit 455f0ad(2022年10月21日)。(2022年10月30日,由commit a23e0b6在commit a23e0b6中合并)
第1231章:修复挤压合并带注解的标记后的挤压合并
签署人:菲利普·布兰
当调用git subtree
merge --squash
(man)$ref'时,无论是直接调用还是通过git subtreepull --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”,请指示用户尝试直接提取缺少的对象。