我有两个git回购:
每当我想发布代码时,我想将开发者仓库的快照推送到公共仓库。由于开发人员仓库可能包含一些不适合公开的提交消息,我想用新的提交消息推送到公共仓库。
我的想法是(假设我在dev repo的主分支中):
// create remote
git remote add p_repo git://some_repo
// create orphaned branch to get rid of commit history
git checkout --orphan pub_sync
// commit
git commit -m "release info"
// push local master to remote master
git push p_repo pub_sync:master
当公共仓库为空时,这是第一次有效。但是对于第二次公开推动,我得到了一个快进错误。同时没有其他公共回购承诺!
我认为问题是,git不知道孤立分支与公共主人有关。
但是我该如何解决这个问题呢?
TL; DR
使用git merge --squash --no-commit
细节
对于第一次提交,您的过程听起来很有发现。
对于后续提交,我会使用
git merge --squash --no-commit
为了实现这一点,您需要一个包含dev repo和公共repo的沙箱,就像您所做的那样,尽管我希望如果沙盒是公共仓库的克隆,这将是最简单的。
这是一个应该有效的程序:
git clone public_repo
cd public_repo
git remote add dev dev_repo_url
git fetch dev
git merge --squash --no-commit dev/master
git commit -m'updated to version X'
git push
从git merge --squash --no-commit
获得的结果将与您的dev repo没有任何关联,它只会将文件的状态记录到您的沙盒中,然后您可以将其作为后续步骤提交。
如果合并导致冲突,你可能需要添加一个-Xtheirs
,因为我假设你想要完全是dev/master
的状态,而不是公共和dev分支的某些合并。
为什么
这种方法的重点是新的提交将以前的公共版本作为其父级,这是您在公共仓库中想要的。你得到的错误是由于新版本不是前一版本的孩子,而是一个新的根,通常不推荐。
问题是您正在尝试将新提交推送到远程主服务器,从远程主服务器无法访问远程主服务器上的提交。你第一次这样做,大概是遥控器没有提交。所以你开始了
O -- x ... x -- A <--(master)
在你当地的回购。你创建了孤儿分支并推送,所以现在你有了
O -- x ... x -- A <--(master)
R1 <--(pub_sync)(p-repo/master)
现在你没有明确说明你是如何第二次这样做的,但听起来你要么删除了当地的pub_sync
分支,要么做了相同的事情。 (因为否则,遵循与上面完全相同的步骤,分支创建将失败。)因此,在您进行了一些开发和另一个新的checkout --orphan
后,您将拥有
O -- x ... x -- A -- x .. x -- B <--(master)
R1 <--(p-repo/master)
R2 <--(pub_sync)
也许这就是你对git“不知道”新的孤儿分支与远程master
有关的意思,在这种情况下你是对的。现在你可以强制推动pub_sync
,但我不推荐它有两个原因:首先,强制推动不应该是你工作流程的常规部分。其次,由于您将发布版本保留在repo中,我假设您希望保留发布历史记录。
你真正需要的是创建R2
作为R1
的孩子。
在另一个答案中,有人建议壁球合并;问题是,您必须手动跟踪合并基础。你可以遵循一种模式,你首先将真正的合并到一个中间分支,然后再将这一个补丁重新应用到最终版本分支;但是你的用例可能有点过分。或者,您可以创建一个ref来表示合并基础,并记住在每次压缩合并后移动它。另外,与其他答案的指示相反,如果您不想冒险意外暴露prod repo中的dev提交,则需要在dev端进行squash合并并仅推送结果。
或者,你可以使用commit-tree
;这也有点麻烦,但可能是脚本或别名。你不会删除/重新孤立同步分支;所以从
O -- x ... x -- A -- x .. x -- B <--(master)
R1 <--(pub_sync)(p-repo/master)
你会
git checkout pub_sync
git merge $(git commit-tree -p HEAD -m "commit message" master)
git push p-repo pub_sync:master