我有两个git repos:
每当我要发布代码时,我都希望将开发人员存储库的快照推送到公共存储库。由于开发人员存储库中可能包含一些不适合公众使用的提交消息,因此我想使用新的提交消息推送到公共存储库中。
我的想法是(假设我在开发仓库的主分支中):
// 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不知道孤立分支与公共主控有关。
但是我该如何解决呢?
答案 0 :(得分:0)
TL; DR
使用git merge --squash --no-commit
详细信息
对于第一次提交,您的过程听起来很简单。
对于后续提交,我将使用
git merge --squash --no-commit
要使其正常工作,您需要像开发库一样同时包含开发仓库和公共仓库的沙箱,尽管我希望,如果沙箱是公共仓库的克隆,这将是最简单的。
这是应该起作用的过程:
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
获得的结果将与开发仓库没有任何联系,它只会将文件的状态保存到沙箱中,然后您可以将其提交作为后续步骤。
如果合并导致冲突,您可能需要添加一个-Xtheirs
,因为我假设您确切地想要dev/master
的状态,而不是public和dev分支的某些合并。
为什么
此方法的要点是,新提交将以前的公共版本作为其父版本,这是您在公共仓库中想要的。您收到的错误是由于新版本不是先前版本的子版本,而是新的根目录,通常不建议这样做。
答案 1 :(得分:0)
问题是您正在尝试将新的提交推送到远程主服务器,从该远程主服务器无法访问当前在远程主服务器上的提交。第一次执行此操作时,大概是远程没有提交。所以你从
开始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
,但是由于两个原因,我不推荐这样做:首先,强制推入不应成为您工作流程中的日常工作。其次,由于您将发布保留在回购中,因此我假设您想在此处保存发布历史。
您真正需要的是将R2
创建为R1
的子级。
在另一个答案中,有人建议将南瓜合并;问题在于,您将必须手动跟踪合并基础。您可以遵循一种模式,在此模式下,您首先将真实合并到中间分支,然后仅将一个补丁重新应用到最终发行分支。但这对您的用例来说可能是过大了。或者,您可以创建一个ref来表示合并基础,并记得在每次壁球合并后将其移动。另外,与其他答案的指示相反,如果您不想冒意外将产品提交暴露于产品仓库中的风险,则需要在开发人员方面进行壁球合并,仅推送结果。>
或者,您可以使用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