我有一组特定的代码藏在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命令不支持存储吗?是否有可能做我想做的事情?
答案 0 :(得分:3)
首先,快速说明:每个存储实际上只是一组提交,以特定格式("stash bag")不在任何分支上。 (这里最简单的方法可能是将存储转换为一个分支,这使得它变得更加简单。有关详细信息,请参阅this answer的git 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
例如。删除标记会删除此提交的名称。