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
例如。删除标签会删除这组提交的名称。
我在 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}
.
解决方案,那么,如果你真的想这样做,就是给散列 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
例如。删除标签会删除这组提交的名称。