git subree push --squash不会挤压

时间:2013-11-20 17:19:40

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

我正在使用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之后只显示 <:em>:如果取消注释第一个git log blabla,则会得到以下输出,显示存储历史但没有lib / master的符号:< / p>

* 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

2 个答案:

答案 0 :(得分:7)

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

git中的手册说明:

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

如果您查看original subtree project中的更多扩展文档,您会注意到仅--squashadd解释了merge选项,因为将内容放入存储库的过程。由于pull是一种经过修改的合并形式,因此也暗示它可以使用--squash

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

--squash选项确实被splitpush接受且没有错误,但经过实验后似乎没有任何区别,就像您的示例所述。我的看法是它存在错误,只是被splitpush命令忽略了。

答案 1 :(得分:3)

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

2015年5月7日commit 6ccc71a旁边的Danny Lin (danny0838) Junio C Hamano -- gitster --在2015年5月22日commit 6263f58合并)

contrib/subtree :没有push --squash

  

文档说明--squash代表“add”,“merge”,“pull”和“push”,而{{1}实际上并没有改变'--squash'的行为   更正文档。

push
  

此选项仅对--squash: addmerge命令有效。