1

我有一组特定的代码隐藏在 git 中,并且想将其捆绑起来,以便将其传输到单独 PC 上的不同克隆,但我还没有弄清楚如何在 bundle 命令中引用存储。

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.

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

4

1 回答 1

3

首先,快速说明:每个存储实际上只是一组提交,采用特定格式(“存储包”),不在任何分支上。(这里最简单的事情可能是将存储转换分支,这使得一切变得更加简单。有关详细信息,请参阅此答案git stash branch的部分。)

bundle 命令不支持存储吗?

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

文档中所述git bundle<git-rev-list-args>论点是:

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

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

git bundle只会打包git show-ref 显示的引用:这包括头、标签和远程头。不能打包之类的引用master~1...

尽管他们的示例使用master~1了 ,但任何不是实际引用名称的东西都会与这个问题发生冲突,包括像stash@{1}.

那么,如果您真的想这样做,解决方案是为哈希 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://之间的或服务器之间的网络协议)获取或推送标签。)

你现在有一个标签,temp-tag,它作为一个存储。给定此标签时,常规git stash命令可以正常工作:

git stash apply temp-tag

例如。删除标签会删除这组提交的名称。

于 2017-08-01T19:17:24.703 回答