我正在使用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
答案 0 :(得分:7)
这可能是子树命令文档中的错误。
git中的手册说明:
options for 'add', 'merge', 'pull' and 'push'
--squash merge subtree changes as a single commit
如果您查看original subtree project中的更多扩展文档,您会注意到仅--squash
和add
解释了merge
选项,因为将内容放入存储库的过程。由于pull
是一种经过修改的合并形式,因此也暗示它可以使用--squash
。
手册列表中的push
没有意义。 git subtree push
子命令是git subtree split
和git push
的组合。这意味着--squash
应该是split
也支持的选项,但split
未在手动列表中列出。文档中既没有说明它可以使用--squash
。
--squash
选项确实被split
和push
接受且没有错误,但经过实验后似乎没有任何区别,就像您的示例所述。我的看法是它存在错误,只是被split
和push
命令忽略了。
答案 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:
,add
和merge
命令有效。