Bazaar-仅提取最新的修订版本(而不是整个分支)

Bazaar-仅提取最新的修订版本(而不是整个分支)

不久:我怎样才能从远程集市存储库中获取最新修订版(仅限)并将其作为新修订版添加到本地存储库。

背景:我有一个开发系统和一个生产系统。在开发系统上,有一个集市存储库,其中包含大量开发修订的分支。有时我想将最新的开发合并到生产系统中。我想通过某种“拉动”来实现这一点(出于安全原因,开发系统无法连接到生产系统,但生产系统可以启动与开发的连接)。

在生产中,我不需要整个开发修订历史,只需要那些实际投入生产的修订(通常是分支尖端)。但我希望生产系统上的版本控制能够跟踪每次实际投入生产的内容。

bzr pull拉取整个分支。bzr pull --revision=last:1同样拉取整个分支,直到指定的修订版本。

bzr merge --pull --revision=last:1也会拉动整个分支。bzr merge --pull --revision=last:2..last:1并且bzr merge --pull --change=last:1都只拉动新的变化在最新版本中引入了更改,但没有引入旧版本中的变化。

使用轻量级签出,我无法跟踪投入生产的修订版本 - 本地工作树仍然是远程存储库的一部分

目前我看到的唯一方法是使用 rsync 或 scp 导入工作树,然后将其提交到本地分支。还有更好的想法吗?

答案1

在某种程度上,您可以通过运行以下命令来实现这一点:

$ bzr branch --stacked REMOTE-URL LOCAL-PATH

这将创建一个仅包含最近几个修订版本的本地分支。它是一个独立分支,因此如果您在本地分支中提交,它将不会自动推送到远程分支。如果您尝试访问本地分支中不可用的任何数据,bzr 将转到远程分支查找该数据。

答案2

首先,在我看来,您无法通过只提取最后一个修订版本来实现这一点,因为每个修订版本仅存储与前一个修订版本的差异。这解释了为什么例如bzr merge --pull --change=last:1不起作用。

我真的会把整个分支都拔掉,但如果你不想这样,你可以这样做

bzr diff -rx -p1

您已在生产中包含的最后一个修订版本在哪里x。这将创建当前工作目录和修订版本之间的所有更改的概览x,但不包含两者之间修订版本的所有详细信息。该-p1标志确保输出采用补丁格式(http://doc.bazaar.canonical.com/beta/en/user-reference/diff-help.html)然后您可以在生产系统上应用此补丁。

我认为它很丑,但它也许能起到作用。

答案3

如果我理解正确的话,您想将生产分支同步到与开发分支提示相同的状态,但没有修订历史记录,对吗?

你可以这样做:

bzr merge OTHER_URL
bzr revert --forget-merges
bzr commit

结果实际上就像您挑选了所有缺失修订的更改并一次性提交它们一样。

但是,这里有一个很大的警告。由于修订历史记录未保留,Bazaar 不知道您挑选的更改已应用。结果是下次您尝试这些相同的步骤时,您将遇到冲突。所以我认为这不是一个可用的解决方案。

另一种方法(有不同的警告)是这样的:

bzr diff --new OTHER_URL | patch -p0

这会将当前分支和参考分支的差异应用为补丁。需要注意的是,补丁无法处理重命名。

总而言之,我认为你试图做的事情很奇怪。你应该只拉取或合并并保留历史记录。或者,你可以尝试使用功能分支。关于功能分支的事情是,一旦功能完成,你就停止对其进行工作。在这种情况下,你可以合并整个功能分支并忘记中间修订,因为你永远不会再从功能分支合并,所以你不会遇到双重挑选问题。

相关内容