是否可以将git的stash推送到远程仓库?
如何将git stash推送到远程存储库?
问题出现的原因:
用户想要将本地存储库中的git stash推送到远程存储库,以便在不同计算机之间共享stash。
解决方法:
1. 首先,用户需要将源存储库克隆到一个临时存储库中。假设源存储库位于~/OLDREPO中,可以使用以下命令克隆为一个名为TEST的临时存储库:
cd ~/OLDREPO git clone . /tmp/TEST
2. 然后,用户可以将所有的stash作为临时分支推送到TEST存储库中。可以使用以下命令实现:
git send-pack /tmp/TEST $(for sha in $(git rev-list -g stash); \ do echo $sha:refs/heads/stash_$sha; done)
3. 接下来,用户需要在接收端循环处理分支,将其转换回stash。可以使用以下命令实现:
cd /tmp/TEST/ for a in $(git rev-list --no-walk --glob='refs/heads/stash_*'); do git checkout $a && git reset HEAD^ && git stash save "$(git log --format='%s' -1 HEAD@{1})" done
4. 如果需要,可以清理临时分支。可以使用以下命令删除临时分支:
git branch -D $(git branch|cut -c3-|grep ^stash_)
5. 最后,用户可以使用git stash list命令来查看stash列表,确认stash是否成功推送到远程存储库。
以上是将git stash推送到远程存储库的解决方法。用户可以按照上述步骤逐步操作,即可实现将stash推送到远程存储库的需求。
问题的出现原因是无法通过fetch或其他方式从远程仓库获取git stash。即使将mirror refspec设置为fetch = +refs/*:refs/*
,stash(refs/stash
)也不会被发送。即使显式设置refs/stash:refs/stash
也没有效果。这可能会导致混淆,因为这只会获取最新的stash,而不是所有的stash。stash列表是refs/stashes
的reflog。
解决方法是可以从git远程仓库获取最新的stash,但不是直接获取到自己的stash中,而是获取到另一个ref中。例如git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
,然后使用git stash apply some-remote/stash
。但是无法获取旧的stash,因为它们存储在无法被获取的reflog中。
在这段内容中,一个开发人员描述了他在处理非暂存更改时的解决方案。他在自己的分支上工作,直到完成或者做了一些可以向公众展示的提交之前,才将分支合并到主分支并推送到远程仓库。当他想要将非暂存更改转移到另一台计算机时,他会执行以下步骤:
1. 创建一个提交,提交信息为"[non-commit] FOR TRANSFER ONLY
",其中包含要转移的内容。
2. 登录到另一台计算机。
3. 执行以下命令:git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
。这个命令从该URL拉取远程分支"rb"的更改到本地分支"lb"。请注意,如果您以不同的方式访问仓库,则URL可能会有所不同。这里的作者在自己的计算机上运行了一个ssh服务器,并且可以通过该方式访问仓库。
4. 执行命令git reset HEAD^
(隐含--mixed
)。这个命令将HEAD重置为"[non-commit]"提交之前的状态。
根据git-reset(1)
的说明:
"--mixed
:重置索引但不重置工作树(即,修改的文件被保留但未标记为提交)[...]"
因此,最后你将拥有文件的更改,但不会在主分支上进行提交,也不需要使用stash。
然而,这需要你在创建"[non-commit]"提交的仓库中执行git reset --hard HEAD^
命令,因为该提交是无用的。
这种方法比创建一个新的特性分支再在之后删除它要"脏"得多... 这取决于你的环境。可能有一些CI/CD工具阻止随意推送分支到上游。但是,是的,取决于你的偏好,你可能希望创建一个分支来完成相同的事情。