git subree push --squash不会挤压

ibi*_*man 8 git push git-push squash git-subtree

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

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

如何重现

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

并且:

* 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,lib看到了"repo commit 2,3,4"虽然我指定了squash选项.相反,另一种方式工作Squashed 'lib/' content from commit f28bf8e.

我尝试使用git版本1.8.1.msysgit.1的Windows和使用git版本1.8.3.4的linux.

那么为什么--squash选项没有做壁球呢?

边题

为什么lib/master出现在repo存储库的日志中?知道它似乎后,"失败" git push:如果取消对第一git log blabla你展示藏历史,但没有任何的lib /主的标志下面的输出:

* 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
Run Code Online (Sandbox Code Playgroud)

Lop*_*Sae 7

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

git中的手册说明:

options for 'add', 'merge', 'pull' and 'push'
    --squash              merge subtree changes as a single commit
Run Code Online (Sandbox Code Playgroud)

如果在检查更多的扩展文档原来的树项目,你会发现,--squash选项仅适用于解释addmerge作为功能用于将内容转换成你的储存库的过程描述.由于pull是一种经过修改的合并形式,因此也暗示它可以使用--squash.

push手动列表什么是没有意义的.所述git subtree push子命令是的组合git subtree splitgit push.这意味着它--squash应该是一个也受支持的选项split,但split未列在手册列表中.文档中既没有说明它可以使用--squash.

--squash选项确实是接受splitpush没有错误,但实验之后似乎没什么区别,就像你的榜样状态.我的看法是,这是有错误,只是被忽略splitpush命令.

  • 更新:我已经发送补丁到git邮件列表修复此问题.希望很快能听到他们:) (2认同)

Von*_*onC 5

现在(Git 2.5, Q2 2015)在官方git subtree文档中得到证实。

提交6ccc71aDanny Lin先生(danny0838,2015年05月07日
(以合并JUNIOÇ滨野- gitster-提交6263f58 2015年5月22日)

contrib/subtree: 没有 push --squash

文档说这--squash是针对 ' add'、' merge'、' pull' 和 ' push',而--squash实际上并没有改变 ' push'的行为。
更正文档。

--squash:
Run Code Online (Sandbox Code Playgroud)

此选项仅适用于addmergepull命令。


在 Git 2.29(2020 年第四季度)中,子树 (in contrib/)的文档更加清晰。

请参阅Danny Lin ( )提交的 ce820cb提交 f99c0c9(2020 年 8 月 18 日(由Junio C Hamano合并-- --提交 8923a45 中,2020 年 8 月 24 日)danny0838
gitster

contrib/subtree: 文档 ' push' 不带 ' --squash'

签字人:Danny Lin

git subtree push不支持--squash,如之前6ccc71a9 中所示(“ contrib/subtree:没有push --squash”,2015-05-07,Git v2.5.0-rc0 --合并第 4 批中列出)

文档不再提及push.