【问题标题】:Export a stash to another computer将存储导出到另一台计算机
【发布时间】:2011-04-27 17:54:41
【问题描述】:

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

在计算机 1 上我做了

$ git stash save feature

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

$ git stash show -p > patch

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

【问题讨论】:

  • fyi git stash save 现在已弃用,取而代之的是 git stash push
  • 不幸的是,git stash show 会忽略未跟踪的文件,即使它们被隐藏。
  • @AndrzejWąsowski 疯狂的时机:在您发表评论的前两天,git 2.32.0[-u|--include-untracked|--only-untracked] 一起为git stash show 发布。我在问题中的替代命令现在是 git stash push --include-untrackedgit stash show --include-untracked --patch > patch

标签: git


【解决方案1】:

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

git apply patchfile

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

git stash

【讨论】:

  • 阅读此答案后,我想知道的一件事是如何从我所有的存储中选择一个特定的存储。答案在这里:stackoverflow.com/a/1910142/1148702。在这种情况下,我最终做了:git stash show "stash@{0}" -p > patch 而不是 OP 的第二个 shell 命令。
  • @TimCamber 我认为您不需要在 stash@{0}.. 周围加上双引号。
  • @arigold 取决于您使用的外壳。例如,在 PowerShell 中,您需要它们,因为花括号是一种特殊的语法。
  • 如果有人收到错误“git patch does not apply”,请试试这个git apply --reject --whitespace=fix mychanges.patch
  • @rishiehari 非常好!!我有一堆patch does not applycannot apply binary patch to my_file.aar without full index linegit apply --reject --whitespace=fix mypatchfile 做得不错。两个文件仍然有问题,但我可以手动复制这些文件
【解决方案2】:

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

将存储创建为补丁

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

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

应用补丁

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

$ git apply changes.patch

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

$ git apply changes.patch --reverse

【讨论】:

  • 我必须将 '-p' 参数替换为 '--binary' 才能使其正常工作
  • 当我尝试在我创建的同一台计算机上应用补丁时收到错误patch does not apply
  • @TheCrazyProgrammer 你跑了git apply changes.patch 还是git stash apply changes.patch?前者有效,后者给我错误(使用或不使用< 来读取文件作为输入)。
  • @TheCrazyProgrammer 使用git apply --3way changes.patch 稍后尝试解决冲突,如果您有“补丁不适用”。更多信息:stackoverflow.com/questions/4770177/git-patch-does-not-apply/…
  • 在 diff 也用于创建新文件时不起作用
【解决方案3】:

或者,您可以使用 stash(在计算机 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 apply;你可以使用 git cherry-pick --no-commit。


如果您的计算机1和计算机2之间没有直接连接;您可以使用遥控器(如 github 或类似的东西):

git push origin stashed_changes_branch

在计算机 2 上:

git fetch

【讨论】:

  • 这假定源系统 (computer1) 已打开以接收外部连接,对于大多数登陆这里的人来说,这不太可能是真的。如果您想走分支路线,为什么不将临时分支推送到远程源并从计算机 2 中提取呢?如果您不想保留远程分支,则可以在拉取远程分支后立即删除它。 git 中的分支非常便宜,通常没有理由不使用它们。
  • @indivisible 我不同意今天有很多机会在互联网上连接两台计算机。答案中描述的技术可能有助于将正在进行的工作从笔记本电脑转移到局域网上的台式机。甚至像 Hamachi 这样的虚拟 vpn 服务也可用于通过互联网在运行 git 的计算机之间直接传输文件。
  • @steampowered,确定它可能对于某些人/情况是正确的,但我认为对于未来的读者来说这是值得注意的一点,因为这是该解决方案工作的硬性要求并修改您的本地环境/系统以接受传入的流量需要不平凡的配置,在我看来,对于这样的任务来说,这是“矫枉过正”。如果您的系统已经打开,那么一定要使用这个答案 - 这不是不正确的。我只是觉得大部分登陆这里的用户不会有这样的情况。
  • 存储是提交对象,因此已经有一个提交哈希(参见git stash list --oneline),所以从技术上讲,您不必将存储应用于新的提交对象。换句话说,不需要创建新分支。但是,至少可以说,将存储直接推送到遥控器是很棘手的。
【解决方案4】:

或者,您可以将整个本地存储(+ 其他本地分支、本地标签等)复制到另一台计算机,如下所示:

  • git pull 在您的旧 git 目录和新 git 目录上,以确保两者都有最新的更改(或者使用 git reset --hard commit-hash 确保两个存储库具有相同的 HEAD)。
  • .git文件夹从旧的git目录复制到新的仓库

【讨论】:

  • 虽然 .git 的压缩 tar 为 700M+,但事实证明这比其他建议的解决方案要容易得多,尤其是因为我有多个存储空间。
【解决方案5】:

如何在 SourceTree 中导出 Stash:

  1. 从您要使用 Stash 的分支创建一个新分支“StashTransfer”
  2. 应用你的 stash 并提交

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

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

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

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

【讨论】:

    【解决方案6】:

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

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

    总体而言,我认为原生 Git 解决方案更简洁,但这个 rsync hack 对于可能比 git 更熟悉 rsync 的匆忙的人来说可能会很好。

    【讨论】:

      【解决方案7】:

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

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

      这就是我为将所有存储从一个存储库完全恢复到另一个存储库所做的。如果不能将它们放在同一台计算机上,可以在创建它们后将 stash 标签保存在 bundle 中,然后将 refs 列表和 bundle 复制到目标计算机。

      从原始仓库的根目录:

      1. 获取存储引用列表
      2. 标记您的存储参考,以便您可以使用 git fetch 检索它们(标记名称不重要,如果有冲突,请更改它。我使用stash_ + 逻辑存储参考中的数字)
      3. 将逻辑引用转换为 sha1 哈希以相反的顺序 - 我们稍后会使用它们
      4. 保存该 repo 路径 - 也供以后使用
      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
      

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

      现在在新的 repo 中,对于每个 ref:

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

      【讨论】:

        【解决方案8】:

        原帖中的启动命令:

        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
        

        这更复杂,但对我有用。

        【讨论】:

          【解决方案9】:

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

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

          git apply path/to/the/patch/file

          应用补丁文件中的存储

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

          【讨论】:

            【解决方案10】:

            如果您想将更改从一台机器移动到另一台机器,您可以随时在您的机器上提交更改,然后在他们的机器上进行软重置。

            办公室

            git commit -m "-stash-"

            厨房

            git reset --soft HEAD~1

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多