gpt4 book ai didi

git subtree push --squash 不压缩

转载 作者:太空狗 更新时间:2023-10-29 12:59:14 25 4
gpt4 key购买 nike

我正在使用 git subtree 来组织我的 git 存储库。假设我有一个名为 repo 的主存储库和一个名为 lib 的库。

我通过压缩历史成功地“导入”了 lib 存储库。我现在也想通过压缩历史来回馈 lib。这似乎不起作用:我为 git subtree push 指定了 --squash 选项,但是在查看历史记录时我仍然发送了所有提交。

如何重现

这是一个脚本,显示了重现问题所需的最少命令:

#!/bin/bash
rm -rf lib lib-work repo

# repo is the main repository
git init repo
# lib is the 'subtreed' repository (bare to accept pushes)
git init --bare lib

git clone lib lib-work
cd lib-work
# adding a bunch of commits to lib
echo "v1" > README
git add README
git commit -m 'lib commit 1'
echo "v2" > README
git add README
git commit -m 'lib commit 2'
echo "v3" > README
git add README
git commit -m 'lib commit 3'
git push origin master
cd ..

cd repo
# adding initial commit to have a valid HEAD
echo "v1" > README
git add README
git commit -m 'repo commit 1'
git remote add lib ../lib
git subtree add --prefix lib lib master --squash
echo "v4" > lib/README
git add lib/README
git commit -m 'repo commit 2'
echo "v5" > lib/README
git add lib/README
git commit -m 'repo commit 3'
echo "v6" > lib/README
git add lib/README
git commit -m 'repo commit 4'
#git log --all --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s%Creset' --abbrev-commit
# "not working" command :
git subtree push --prefix lib lib master --squash

# pretty print the history
git log --all --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s%Creset' --abbrev-commit
cd ../lib
echo
git log --all --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s%Creset' --abbrev-commit

git log 显示问题

两个 git log blabla 命令的输出是:

* b075d5e - (HEAD, master) repo commit 4
* ebdc7c7 - repo commit 3
* 9f1edab - repo commit 2
* 3d48bca - Merge commit '34e16a547819da7e228f3add35efe86197d2ddcb' as 'lib'
|\
| * 34e16a5 - Squashed 'lib/' content from commit 2643625
* 3f1490c - repo commit 1
* 1f86fe3 - (lib/master) repo commit 4
* 9f1639a - repo commit 3
* 8bd01bd - repo commit 2
* 2643625 - lib commit 3
* 3d64b8c - lib commit 2
* aba9fcb - lib commit 1

和:

* 1f86fe3 - (HEAD, master) repo commit 4
* 9f1639a - repo commit 3
* 8bd01bd - repo commit 2
* 2643625 - lib commit 3
* 3d64b8c - lib commit 2
* aba9fcb - lib commit 1

如您所见,尽管我指定了 squash 选项,但 lib 看到了 "repo commit 2,3,4"。另一种方法有效,因此 来自提交 f28bf8e 的压缩“lib/”内容

我尝试在 windows 上使用 git 版本 1.8.1.msysgit.1 和在 linux 上使用 git 版本 1.8.3.4。

那么为什么 --squash 选项不进行压缩?

附带问题

为什么 lib/master 会出现在 repo 仓库的日志中?知道它出现在“失败的”git push 之后:如果您取消注释第一个 git log blabla,您会得到以下显示 stash 历史的输出但没有 lib/master 的迹象:

* b075d5e - (HEAD, master) repo commit 4
* ebdc7c7 - repo commit 3
* 9f1edab - repo commit 2
* 3d48bca - Merge commit '34e16a547819da7e228f3add35efe86197d2ddcb' as 'lib'
|\
| * 34e16a5 - Squashed 'lib/' content from commit 2643625
* 3f1490c - repo commit 1

最佳答案

这可能是子树命令文档中的错误。

git 中的手册指出:

options for 'add', 'merge', 'pull' and 'push'
--squash merge subtree changes as a single commit

如果您查看 original subtree project 中的更多扩展文档您会注意到 --squash 选项仅针对 addmerge 进行了解释,因为该功能是针对将内容引入的过程描述的你的存储库。由于pull是merge的修改形式,所以也暗示可以使用--squash

手册中的push 没有意义。 git subtree push 子命令是 git subtree splitgit push 的组合。这意味着 --squash 应该是 split 也支持的选项,但是 split 没有在手册列表中列出。文档中从未说明它可以使用 --squash

--squash 选项确实被 splitpush 接受而没有错误,但经过试验后似乎没有什么区别,正如您的示例所述。我的看法是,它是错误地存在的,只是被 splitpush 命令忽略了。

关于git subtree push --squash 不压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com