是否可以将git的stash推送到远程仓库?

20 浏览
0 Comments

是否可以将git的stash推送到远程仓库?

在git中,是否可以创建一个stash,将stash推送到远程仓库,在另一台计算机上检索stash,并应用stash?

或者我的选择是:

  • 创建一个补丁并将补丁复制到另一台计算机上,或者
  • 创建一个小分支并将未完成的工作提交到该分支上?
0
0 Comments

如何将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推送到远程存储库的需求。

0
0 Comments

问题的出现原因是无法通过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中。

参考链接:stackoverflow.com/questions/2248680/…

0
0 Comments

在这段内容中,一个开发人员描述了他在处理非暂存更改时的解决方案。他在自己的分支上工作,直到完成或者做了一些可以向公众展示的提交之前,才将分支合并到主分支并推送到远程仓库。当他想要将非暂存更改转移到另一台计算机时,他会执行以下步骤:

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工具阻止随意推送分支到上游。但是,是的,取决于你的偏好,你可能希望创建一个分支来完成相同的事情。

0