【问题标题】:git subtree push --squash does not squashgit subtree push --squash 不压扁
【发布时间】:2013-12-04 20:07:17
【问题描述】:

我正在使用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

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"。 反过来工作,因此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/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

【问题讨论】:

  • 对于附带问题,由于--all 选项,您会看到额外的日志。使用该选项就好像您正在获取refs/ 中所有引用的日志,因为推送操作会在那里创建一个新引用,因此它会沿着HEAD 的日志打印。
  • 我认为您在附带问题中的日志是错误的,或者您创建存储库的时间可能不同,因为哈希与您上面的哈希不匹配。
  • @LopSae,谢谢 :) 有没有办法阻止推送添加新的参考?如果没有,为什么 fetch 不需要添加引用?关于附带问题,很抱歉造成混淆,我确实后来做了测试,这就是为什么提交不一样。我更新了问题。
  • 通过使用git subtree push 你正在做一个split 创建一个分支(额外的引用),然后推送该引用。可以单独使用split,它只会创建一个提交而不创建新分支,split 只会打印创建的提交哈希。
  • 我明白了,我不介意 push 创建了那个新分支,我只是不想看到它。似乎用--branches 替换--all 可以解决问题,link to log manual

标签: git push git-push git-subtree squash


【解决方案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 命令忽略了。

【讨论】:

  • 好像是这样:在subtree file 中挖掘一点时,您可以看到cmd_add_commit()cmd_merge() 中使用的壁球选项,但cmd_split() 中没有。
  • 更新:我已经向 git 邮件列表发送了一个补丁来解决这个问题。希望尽快收到他们的来信:)
【解决方案2】:

现在(Git 2.5,2015 年第二季度)已在 official git subtree documentation 中确认。

参见 Danny Lin (danny0838)commit 6ccc71a,2015 年 5 月 7 日。
(由 Junio C Hamano -- gitster -- 合并到 commit 6263f58,2015 年 5 月 22 日)

contrib/subtree:没有push --squash

文档说--squash 用于'add'、'merge'、'pull' 和'push',而--squash 实际上并没有改变'@ 987654347@'.
更正文档。

--squash:

此选项仅对addmergepull 命令有效。


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

参见Danny Lin (danny0838)commit ce820cbcommit f99c0c9(2020 年 8 月 18 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 8923a45,2020 年 8 月 24 日)

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

签字人:Danny Lin

git subtree push 不支持--squash,如之前在6ccc71a9 中说明的(“contrib/subtree:没有push --squash”,2015-05-07,Git v2.5.0-rc0 -- merge列在batch #4)

The documentation 不再提及push

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2019-08-19
    • 2013-09-11
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2013-07-27
    相关资源
    最近更新 更多