- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 git subtree
来组织我的 git 存储库。假设我有一个名为 repo
的主存储库和一个名为 lib
的库。
我通过压缩历史成功地“导入”了 lib
存储库。我现在也想通过压缩历史来回馈 lib
。这似乎不起作用:我为 git subtree push
指定了 --squash
选项,但是在查看历史记录时我仍然发送了所有提交。
这是一个脚本,显示了重现问题所需的最少命令:
#!/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"
。另一种方法有效,因此 来自提交 f28bf8e 的压缩“lib/”内容
。
我尝试在 windows 上使用 git 版本 1.8.1.msysgit.1 和在 linux 上使用 git 版本 1.8.3.4。
那么为什么 --squash
选项不进行压缩?
为什么 lib/master 会出现在 repo
仓库的日志中?知道它仅出现在“失败的”git push
之后:如果您取消注释第一个 git log blabla
,您会得到以下显示 stash 历史的输出但没有 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
如果您查看 original subtree project 中的更多扩展文档您会注意到 --squash
选项仅针对 add
和 merge
进行了解释,因为该功能是针对将内容引入的过程描述的你的存储库。由于pull
是merge的修改形式,所以也暗示可以使用--squash
。
手册中的push
没有意义。 git subtree push
子命令是 git subtree split
和 git push
的组合。这意味着 --squash
应该是 split
也支持的选项,但是 split
没有在手册列表中列出。文档中从未说明它可以使用 --squash
。
--squash
选项确实被 split
和 push
接受而没有错误,但经过试验后似乎没有什么区别,正如您的示例所述。我的看法是,它是错误地存在的,只是被 split
和 push
命令忽略了。
关于git subtree push --squash 不压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102594/
在日常工作中,我选择使用 SmartGit 作为客户端。然而,我的团队成员坚持使用 git 原生的非商业 GUI。我们发现我们的 merge 提交看起来有些不同。 这些是 SmartGit 在请求 m
我正在尝试压缩 3 次提交。 我克隆存储库 我用要压缩的提交 checkout 分支 我运行“git rebase -i HEAD~3” 我“选择”最重要的提交,然后“压缩”第二个和第三个提交。这一切
我需要一些帮助来压缩 GitHub 中的提交。 我有大约 30 个提交,我想将前 10 个提交压缩为一个压缩提交,将另外 10 个提交压缩为另一个压缩提交。我使用了 git rebase -i HEA
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
在我的本地开发环境中使用推送部署系统会生成大量提交,我不想将其推送到上游。 我想要一种更快、更自动化的方法来将已自动生成的提交压缩为未自动生成的提交。当我的日志看起来像: > (HEAD -> fea
我有一个尚未发布的本地存储库,其图形结构如下: * G * F |\ | * E | * D * | C: A minor fix -- SQUASHME * | B |/ * A 所以
我见过的所有示例都涉及只有一个提交者的分支。我想要实现的是一个自动 git rebase -i,其中,对于给定的分支.. 给定用户所做的所有提交都将被压缩在一起。 因此,如果 3 个人在一个分支上工作
我的团队正在开发一个长期运行的特性分支,现在有数百个提交,现在我需要将它 merge 到 master 中以进行生产发布。 我不希望在该分支中有那么多提交,因为许多提交都是为了修复错误而完成的,并且每
我的同事(我们在这里称他为 John)和我一起开发一项功能。我们的工作分支如下所示 --o--o--o # this is develop branch \ o--o--o # this i
考虑我有提交 ... -- A -- B -- C 如果我使用 git rebase -i将所有三个提交压缩为一个,我们可以 pick A squash B squash C 我看到了结果提交 A有它
我想在一个分支中间将几个提交压缩在一起,而不修改前后的提交。 我有: A -- B -- C -- D -- E -- F -- G | | m
这个问题在这里已经有了答案: How do I squash two non-consecutive commits? (5 个答案) 关闭 9 年前。 我在 master 分支上有一些非连续的提交
假设我们有一个名为 feature-branch 的功能分支。该分支的开发人员分支获取他们的票,然后打开一个 PR 到 feature-brach。 如果发生以下情况: 开发人员A从feature-b
假设我将文件 A 添加为提交,然后决定删除文件 A。我没有使用 git --amend,而是创建另一个删除文件 A 的提交,我知道这是不好的做法。但是,如果我想使用 git merge --squas
我试图压制迁移。 不幸的是,有太多的循环依赖。 有没有办法重新开始迁移(尽管我的项目已经部署在生产环境中)而不是试图压缩迁移? 我不必担心一些不知名的开发人员使用我的项目,因为它是一个私有(priva
我有一个带有多个提交的开发分支。该分支应 merge 到主分支中。 我也希望主分支提交历史尽可能干净,所以我只想有一个 merge 条目。因此,我执行以下操作: git merge --squash
运行 git merge --squash 时,提交消息包含我正在压缩的所有提交的提交消息,太棒了。然而,由于某种原因,它实际上包含的不仅仅是我正在压缩的提交。 这是我的工作流程: 各种功能分支通常会
运行 git merge --squash 时,提交消息包含我正在压缩的所有提交的提交消息,太棒了。然而,由于某种原因,它实际上包含的不仅仅是我正在压缩的提交。 这是我的工作流程: 各种功能分支通常会
晚上好。我目前正在为项目创建数据库。 场景如下: 新玩家可以在获得已注册并被工作人员接受。 根据年龄和性别将球员分成不同的组别(混合,女子公开赛,男子公开赛) 每场比赛有两名球员,其中 3 分记录套。
我正在尝试使用英语规则模拟 Squash 比赛的计分。它们是: 只有发球者赢得比赛才能获得积分。 如果发球者赢得一场比赛,他们将获得一分并继续担任发球者。 如果接力赛获胜,他们将成为发球者,但不会获得
我是一名优秀的程序员,十分优秀!