git 捆绑隐藏代码

git bundle stashed code

我在 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 命令不支持 stash 吗?可以做我想做的事吗?

首先,快速说明:每个存储实际上只是一组提交,采用特定格式(有关详细信息,"stash bag") that is not on any branch. (The easiest thing to do here is probably to convert the stash to a branch, which makes it all much simpler. See the git stash branch section of this answer。)

Does the bundle command not support the stash?

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

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

A list of arguments, acceptable to git rev-parse and git rev-list (and containing a named ref, see SPECIFYING REFERENCES below)

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

git bundle will only package references that are shown by git show-ref: this includes heads, tags, and remote heads. References such as master~1 cannot be packaged ...

尽管他们的示例使用 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:// 在两台计算机之间或服务器之间获取或推送标签。)

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

git stash apply temp-tag

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