将存储导出到另一台计算机


296

我需要一种将隐藏的更改导出到另一台计算机的方法。

在Computer1上,我做了

$ git stash save feature

我正在尝试将隐藏补丁添加到文件,然后将其导入到另一台计算机

$ git stash show -p > patch

这个命令给了我一个文件,我可以将其移动到另一台克隆了该存储库的计算机上,但是问题是如何再次将其作为存储导入。

谢谢


6
fyi git stash save现在已被弃用,而赞成git stash push
Ewan

Answers:


290

您只需运行以下命令即可应用补丁文件(尚未提交更改)

git apply patchfile

然后,您可以简单地从当前工作目录中创建一个新的存储:

git stash

2
@Marcelo答:很高兴听到您的声音,但是请单击答案的投票编号下方的大对号,以标记您接受的答案。这样,您的问题将被标记为已解决。

2
请注意,系统将不让OP将问题标记为“已接受”,直到从提出问题开始经过了一段时间(我认为是15分钟)。
格雷格·休吉尔

23
阅读此答案后,我想知道的一件事是如何从所有存储中选择特定存储。答案是在这里:stackoverflow.com/a/1910142/1148702。在这种情况下,我最终做了:git stash show "stash@{0}" -p > patch而不是OP的第二个shell命令。
Tim Camber

1
@TimCamber我认为您不需要双引号stash@{0}..
ari gold

2
@arigold取决于您使用的shell。例如在PowerShell中,您需要它们,因为花括号是其中的一种特殊语法。

18

或者,您可以使用以下方式从存储中创建分支(在计算机1上):

git stash branch stashed_changes_branch

提交您的更改:

git commit -a

然后将其添加为计算机2上的远程计算机:

git remote add pc1 user@computer1:/path/to/repo

现在您可以使用

git fetch pc1

现在,您可以按照所需的方式导入提交;使用git cherry-pickgit rebase或任何您喜欢的...如果您希望它看起来像您刚刚应用了git stash;您可以使用git cherry-pick --no-commit。


如果您在computer1和computer2之间没有直接连接;您可以使用遥控器(例如github或类似的东西):

git push origin stashed_changes_branch

在计算机2上:

git fetch

1
假定源系统(computer1)已打开以接收外部连接,对于大多数在此处着陆的人来说,这可能不是真实的。如果要走分支路线,为什么不将临时分支推到远程原点并将其从computer2中拉出呢?如果您不想保留远程分支,则可以在撤消后立即删除它。git中的分支是如此便宜,通常没有理由不使用它们。
不可分割

@indivisible我不同意今天在互联网上有很多连接两台计算机的机会。答案中描述的技术可能对将正在进行的工作从笔记本电脑传输到LAN上的台式机很有用。甚至像Hamachi之类的虚拟vpn服务也将用于直接在运行git的计算机之间通过Internet在任何地方传输文件。
蒸汽动力

1
@steampowered,确保它可能是对某些人/情况属实,但我认为这是个值得注意的一点为未来的读者,因为它是该解决方案的工作和修改局部ENV /系统接受传入流量硬性要求采取不平凡的配置我认为,对于这样的任务,这是“过度杀伤力”。如果您的系统已经打开,那么请务必使用此答案-这不是不正确的。我只是觉得登陆这里的大多数用户不会处于这种情况。
不可分割

散件是提交对象,因此已经具有提交哈希(请参阅参考资料git stash list --oneline),因此从技术上讲,您不必将散件应用于新的提交对象。换句话说,不需要创建新分支。但是,至少可以说,直接将隐藏项推到远程是很难的。
泰勒·克朗普顿

15

或者,您可以将整个本地存储导出到另一个计算机,如下所示

  • git pull 在旧的和新的git目录上,以确保两者都具有最新更改。
  • 将.git文件夹从旧的git目录复制到新的存储库

1
尽管.git的压缩tar为700M +,但事实证明它比其他建议的解决方案容易得多,尤其是因为我有多个存储区。
克里斯·沃思

5

如何在SourceTree中导出Stash:

  1. 从要使用Stash的分支中新建一个“ StashTransfer”分支
  2. 将您的隐藏应用到它并进行提交

  3. 单击您的提交,然后从中提交补丁,并随身携带补丁文件。

  4. 转到其他存储库,选择您刚刚在1)中使用的同一父分支

  5. 操作/应用补丁,选择模式:修改工作副本文件,现在您要在当前工作环境中对补丁进行未提交的修改,请按“应用补丁”

  6. 为当前仓库创建新的存储


4

您可以从一台计算机上将存储文件创建为补丁文件,然后可以将该补丁文件共享给另一台计算机。

创建存储作为补丁

$ git stash show "stash@{0}" -p > changes.patch

“ stash @ {0}”是存储的参考。它将创建具有最新存储的补丁文件。如果您要使用另一命令$ git stash list,请使用命令查看存储的列表,然后选择要修补的存储。

应用补丁

现在,将该存储区转移到另一台计算机上,并将其粘贴到项目的根文件夹中。然后运行此命令

$ git apply changes.patch

如果有错误,您想撤消更改

$ git apply changes.patch --reverse

3

另一种选择是rsync.git文件夹从一台计算机复制到另一台计算机。 rsync仅处理文件更改(比副本更快)。

这种方法的缺点是配置也将被覆盖,如果您在两台机器之间运行不同的.git配置,则可能不希望这样做。但是您可以通过排除中带有--exclude选项的文件来克服此问题rsync

总的来说,我认为本机Git解决方案更干净,但是rsync对于那些急于使用rsync而不是git的人来说,这种黑客技术可能是不错的选择。


3

原始帖子中的启动命令:

git stash show -p stash@{x} > patch_file

不适用于我(由于某种原因,它创建了无法使用的补丁文件)。相反,我必须:

git stash apply stash@{x}
git commit

我想转移的每个藏匿处。然后,将“父”存储库放置在“子”存储库的file:///范围内,并对每个存储提交执行以下操作:

git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child

这比较复杂,但是对我有用。


0

如果要将更改从一台计算机移至另一台计算机,则可以始终在计算机上提交更改,然后在其计算机上进行软重置。

办公室

git commit -m "-stash-"

厨房

git reset --soft HEAD~1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.