git子树推送--挤压不挤压
我正在使用git子树推送--挤压不挤压,git,push,git-push,git-subtree,squash,Git,Push,Git Push,Git Subtree,Squash,我正在使用git子树来组织我的git存储库。假设我有一个名为repo的主存储库和一个名为lib的库 我通过挤压lib存储库的历史成功地“导入”了它。现在,我想通过挤压历史,为lib做出贡献。这似乎不起作用:我将--squash选项指定为git子树推送,但在查看历史记录时,我仍然发送所有提交 如何繁殖 下面是一个脚本,显示了重现问题所需的最少命令: #!/bin/bash rm -rf lib lib-work repo # repo is the main repository git ini
git子树
来组织我的git存储库。假设我有一个名为repo
的主存储库和一个名为lib
的库
我通过挤压lib
存储库的历史成功地“导入”了它。现在,我想通过挤压历史,为lib
做出贡献。这似乎不起作用:我将--squash
选项指定为git子树推送
,但在查看历史记录时,我仍然发送所有提交
如何繁殖
下面是一个脚本,显示了重现问题所需的最少命令:
#!/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日志
显示问题
两个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
以及:
如您所见,lib看到了“repo commit 2,3,4”
,尽管我指定了挤压选项。
另一种方法是从commit f28bf8e中挤压“lib/”内容
我在windows上试用了git版本1.8.1.msysgit.1,在linux上试用了git版本1.8.3.4
那么为什么--squash
选项不进行挤压呢
附带问题
为什么lib/master会出现在repo
存储库的日志中?
知道它只在“失败”git push之后出现:如果取消注释第一个git log blablabla
,您将获得以下输出,显示隐藏的历史,但没有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
如果您在中查看更扩展的文档,您会注意到,--squash
选项仅针对添加
和合并
进行了说明,因为在将内容引入存储库的过程中描述了该功能。由于pull
是一种修改后的合并形式,因此也意味着它可以使用--squash
手动列表中的
按钮没有意义。git子树推送
子命令是git子树拆分
和git推送
的组合。这意味着--squash
应该是split
也支持的选项,但是split
不在手动列表中列出。文档中也没有说明它可以使用--squash
--squash
选项确实被split
和push
接受,没有错误,但在使用它进行实验后,它似乎没有什么区别,正如您的示例所述。我认为它是错误的,只是被拆分
和推送
命令忽略了。现在(Git 2.5,2015年第2季度)在
见2015年5月7日。(于2015年5月22日被合并)
contrib/subtree
:没有推送--squash
文档中说,--squash
用于“add
”、“merge
”、“pull
”和“push
”,而--squash
实际上并不会改变“push
”的行为。更正文档 此选项仅对
add
、merge
和pull
命令有效
使用Git2.29(2020年第4季度),子树文档(在
contrib/
中)更加清晰
参见(2020年8月18日)by.(由年合并,2020年8月24日) :文档“
push
”不接受“--squash
”
签字人:Danny Lin
git子树推压
不支持--squash
,如前面所述(“contrib/subtree
:没有push--squash
”,2015-05-07,git v2.5.0-rc0--中列出)
对于次要问题,不再提及
推送
,您将看到额外的日志,因为--all
选项。使用该选项就好像您正在获取refs/
中所有引用的日志一样,因为推送操作在那里创建了一个新引用,因此它会沿着HEAD
的日志打印。我认为您在附带问题中的日志是错误的,或者可能是您创建存储库的不同时间的日志,由于哈希与上面的哈希不匹配。@LopSae,谢谢:)有没有办法防止推送添加新引用?如果不是,为什么提取不需要添加引用?关于旁题,很抱歉造成混淆,我确实在稍后做了测试,这就是为什么提交不一样的原因。我更新了问题。通过使用git subtree push
您正在执行split
,创建一个分支(额外引用),然后推送该引用。可以单独使用split
,只创建提交而不创建新分支,split
只打印创建的提交哈希。我明白了,推送创建新分支并不介意,我只是不想看到它。它似乎用分支取代了--all
,--branchs
起到了作用。似乎就是这样:当在中挖掘一点时,你可以看到在cmd\u add\u commit()
和cmd\u merge()
中使用的挤压选项,但在cmd\u split()
中没有。更新:我已经向git邮件列表发送了一个补丁来解决这个问题。希望尽快收到他们的来信:)
options for 'add', 'merge', 'pull' and 'push'
--squash merge subtree changes as a single commit
--squash: