Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git子树推送--挤压不挤压_Git_Push_Git Push_Git Subtree_Squash - Fatal编程技术网

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: