如何将git快照从私有git存储库推送到公共git存储库?

问题描述 投票:1回答:2

我有两个git回购:

  1. 私有的开发人员和他们的日常提交
  2. 公开发布的公开发布。

每当我想发布代码时,我想将开发者仓库的快照推送到公共仓库。由于开发人员仓库可能包含一些不适合公开的提交消息,我想用新的提交消息推送到公共仓库。

我的想法是(假设我在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不知道孤立分支与公共主人有关。

但是我该如何解决这个问题呢?

git git-rebase git-push git-remote
2个回答
0
投票

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分支的某些合并。

为什么

这种方法的重点是新的提交将以前的公共版本作为其父级,这是您在公共仓库中想要的。你得到的错误是由于新版本不是前一版本的孩子,而是一个新的根,通常不推荐。


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,但我不推荐它有两个原因:首先,强制推动不应该是你工作流程的常规部分。其次,由于您将发布版本保留在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
© www.soinside.com 2019 - 2024. All rights reserved.