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

Mar*_*o A 274 git

我需要一种方法将存储的更改导出到另一台计算机.

在Computer1上我做到了

$ git stash save feature
Run Code Online (Sandbox Code Playgroud)

我正在尝试将存储补丁发送到文件,然后将其导入另一台计算机

$ git stash show -p > patch
Run Code Online (Sandbox Code Playgroud)

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

谢谢

pok*_*oke 272

您只需运行即可应用补丁文件(无需提交更改)

git apply patchfile
Run Code Online (Sandbox Code Playgroud)

然后,您只需从当前工作目录中创建一个新的存储:

git stash
Run Code Online (Sandbox Code Playgroud)

  • 读完这个答案后,我想知道的一件事是如何从我的所有藏匿处选择一个特定的藏匿处.答案就在这里:http://stackoverflow.com/a/1910142/1148702.在这种情况下,我最终做了:`git stash show"stash @ {0}"-p> patch`而不是OP的第二个shell命令. (18认同)
  • @Marcelo A:很高兴听到,但请点击答案投票号下方的大勾号,标记您接受的答案.这样你的问题就会被标记为已解决. (2认同)
  • 请注意,系统不会让OP将答案标记为"已接受",直到从提出问题时起已经过了一段时间(我认为是15分钟). (2认同)
  • @arigold 取决于您使用的外壳。例如在 PowerShell 中,您需要它们,因为大括号是那里的特殊语法。 (2认同)
  • 如果有人收到错误“git patch does not apply”,请试试这个`git apply --reject --whitespace=fix mychanges.patch` (2认同)
  • @rishiehari 非常好!我有一堆“补丁不适用”和“无法在没有完整索引行的情况下将二进制补丁应用到 my_file.aar”和“git apply --reject --whitespace=fix mypatchfile”做得不错。两个文件仍然有问题,但我可以手动复制这些文件 (2认同)

Sim*_*ran 39

您可以从一台机器创建 stash 作为补丁文件,然后可以将该补丁文件共享到另一台机器。

将存储创建为补丁

$ git stash show "stash@{0}" -p > changes.patch
Run Code Online (Sandbox Code Playgroud)

“stash@{0}”是 stash 的 ref。它将使用最新的 stash 创建补丁文件。如果您想要不同的使用命令$ git stash list来查看您的隐藏列表并选择您要修补的一个。

应用补丁

现在将该存储转移到另一台机器并将其粘贴到项目的根文件夹中。然后运行这个命令

$ git apply changes.patch
Run Code Online (Sandbox Code Playgroud)

如果有错误并且您想撤销更改

$ git apply changes.patch --reverse
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试在我创建的同一台计算机上应用补丁时,出现错误“补丁不适用”。 (2认同)
  • 如果您遇到“补丁不适用”,@TheCrazyProgrammer 使用 `git apply --3waychanges.patch` 尝试稍后解决冲突。更多信息:/sf/ask/333912421/#47756467 (2认同)

Chr*_*aes 15

或者,您可以使用存储(在计算机1上)创建分支

git stash branch stashed_changes_branch
Run Code Online (Sandbox Code Playgroud)

提交您的更改:

git commit -a
Run Code Online (Sandbox Code Playgroud)

然后将其添加为计算机2上的遥控器:

git remote add pc1 user@computer1:/path/to/repo
Run Code Online (Sandbox Code Playgroud)

现在您可以使用检索远程信息

git fetch pc1
Run Code Online (Sandbox Code Playgroud)

现在你可以按照你想要的方式导入提交; 使用git cherry-pick,git rebase或任何你喜欢的...如果你想让它看起来像你刚刚做了git stash apply ; 你可以使用git cherry-pick --no-commit.


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

git push origin stashed_changes_branch
Run Code Online (Sandbox Code Playgroud)

并在计算机2上:

git fetch
Run Code Online (Sandbox Code Playgroud)

  • @steampowered,当然对于某些人/情况来说可能是正确的,但我认为这对未来的读者来说值得注意,因为这是该解决方案工作的硬性要求,并且修改本地环境/系统以接受传入流量需要不平凡的配置在我看来,对于这样的任务来说,这“太过分了”。如果您的系统已经打开,那么请务必使用这个答案 - 这并不是不正确的。我只是觉得大多数登陆这里的用户不会遇到这样的情况。 (4认同)
  • 这假设源系统(computer1)开放以接收外部连接,这对于大多数登陆这里的人来说不太可能是真的。如果您想走分支路线,为什么不直接将临时分支推送到远程源并从 computer2 中提取它呢?如果您不想保留远程分支,则可以在拉取后立即将其删除。git 中的分支非常便宜,通常没有理由不使用它们。 (2认同)

sha*_*eeq 13

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

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


Tho*_*est 13

存储是工作树在基本提交和索引之间的特殊合并提交。一种方法可能是将每个补丁保存为单独的补丁,检查存储的第一个父级,从两个补丁恢复索引和工作树,最后恢复存储(似乎有一个答案是这样的)。

这是从存储中完全重新创建所有信息所必需的,如果您不关心这一点,您至少应该在恢复之前检查存储的第一个父级,以避免冲突并跟踪存储的创建位置。

这就是我将所有存储从一个存储库完全恢复到另一个存储库所做的事情。如果您无法将它们放在同一台计算机上,则可以在创建它们后将存储标签保存在捆绑包中,并将引用列表和捆绑包复制到目标计算机。

从原始存储库的根目录:

  1. 获取隐藏引用列表
  2. 标记您的存储引用,以便您可以使用 git fetch 检索它们(标签名称并不重要,如果存在冲突,请更改它。我使用了stash_+ 逻辑存储引用中的数字)
  3. 以相反的顺序将逻辑引用转换为 sha1 哈希值- 我们稍后会使用它们
  4. 保存该存储库路径 - 也供以后使用
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do git tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD
Run Code Online (Sandbox Code Playgroud)

注意:这需要 bash 或兼容的 shell(ksh、zsh 应该做...)您也可以增加一个变量,例如,stash_$((i++))如果您的 shell 不支持${param//pattern}

现在在新的存储库中,对于每个参考:

  1. 从旧存储库中获取引用(我们甚至不需要使用标签名称,因为我们已经标记了它们,我们可以使用 git fetch 检索它们)
  2. 从引用中重新导入存储,使用该引用的主题作为存储消息。
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Run Code Online (Sandbox Code Playgroud)


ste*_*red 8

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

这种方法的一个缺点是配置也会被覆盖,如果您在两台计算机之间运行不同的 .git 配置,这可能是不需要的。--exclude但是您可以通过使用 中的选项排除文件来克服这个问题rsync

总的来说,我认为原生 Git 解决方案更干净,但rsync对于那些匆忙的人来说,这个 hack 可能会很好,因为他们可能比 git 更熟悉 rsync。


小智 7

git --no-pager stash show -p > patch

将隐藏的更改复制到补丁文件中

git apply path/to/the/patch/file

应用补丁文件中的隐藏内容

以下 shell 脚本允许用户将所有存储从一个文件夹复制到另一个文件夹。 https://gist.github.com/sentilmurukang/29b55a0c0e8694c406991799153f3c43


小智 6

原帖中的启动命令:

git stash show -p stash@{x} > patch_file
Run Code Online (Sandbox Code Playgroud)

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

git stash apply stash@{x}
git commit
Run Code Online (Sandbox Code Playgroud)

对于我想转移的每个藏品。然后,我将“父”存储库放置在“子”存储库的 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
Run Code Online (Sandbox Code Playgroud)

这更复杂,但对我来说很有效。


KEM*_*MBL 6

如何在 SourceTree 中导出 Stash:

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

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

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

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

  6. 为当前的 repo 创建一个新的 Stash