git bundle stashed代码

时间:2017-08-01 18:54:39

标签: git git-stash git-bundle

我有一组特定的代码藏在git中,并希望将其捆绑以便将其传输到另一台PC上的不同克隆,但我还没想出如何在bundle命令中引用stash。

stash@{0}: On issue/789: Something I do not want bundled
stash@{1}: WIP on issue/456: Something I do want bundled
stash@{2}: On issue/123: Something else I do not want bundled

我试过了:

git bundle create My-WIP.bundle stash@{1}

但收到以下错误:

error: Refusing to create empty bundle.

我可以确认存储@ {1}不是空的。 bundle命令不支持存储吗?是否有可能做我想做的事情?

1 个答案:

答案 0 :(得分:3)

首先,快速说明:每个存储实际上只是一组提交,以特定格式("stash bag")不在任何分支上。 (这里最简单的方法可能是将存储转换为一个分支,这使得它变得更加简单。有关详细信息,请参阅this answergit stash branch部分。)< / p>

  

bundle命令不支持存储吗?

这是正确的:它不是 - 至少,不是你尝试使用它的方式。但是有一个简单的(ish)修复。

the git bundle documentation所述,<git-rev-list-args>参数为:

  

git rev-parse git rev-list 可接受的参数列表(包含命名参考,请参阅指定参考下文)

(粗体我的)。他们提到的部分继续说:

  

git bundle 只会打包由 git show-ref:显示的引用,其中包括head,tags和remote head。 master~1等引用无法打包 ...

虽然他们的示例使用master~1,但任何不是实际引用名称的内容都会与此问题相悖,包括stash@{1}之类的reflog引用。

然后,如果您真的想这样做,那么解决方案就是为哈希ID提供正确的引用名称,例如分支或标记名称。我们在这里使用标签名称:

git tag temp-tag stash@{1}

现在你有了一个标签,可以创建一个包(或者,更简单,只需在网络上推送或获取标签,这样你就不需要计算适当的基础或基础集)。为了避免形成一个巨大的束,你可以给一些适当的基础作为一个停止点,例如:

git bundle create foo.bundle temp-tag ^master

(假设^master是一个合适的停止点)。

您现在可以在本地删除标记:

git tag -d temp-tag

并传输捆绑包并在另一个系统上运行git fetch,以在那里创建标记。 (或者,再次,不要弄乱git bundle,只需使用两台计算机之间的git://ssh://等网络协议或服务器来获取或推送标签。)< / p>

您现在拥有一个标记temp-tag,可用作存储。给定此标记时,常规git stash命令可正常工作:

git stash apply temp-tag
例如

。删除标记会删除此提交的名称。