导出存储到另一台计算机

我需要一种方法来导出存储的变化到另一台计算机。

在1号电脑上我做到了

$ git stash save feature

我试图获得隐藏补丁到一个文件,然后将其导入到另一台计算机

$ git stash show -p > patch

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

133666 次浏览

您可以通过简单地运行应用补丁文件(无需提交更改)

git apply patchfile

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

git 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择优挑选git变基或任何你喜欢的… 如果你想让它看起来像你刚刚做了Git stash应用;你可以使用Git精挑细选——不提交。


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

git push origin stashed_changes_branch

在计算机2上:

git fetch

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

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

另一种选择是将rsync文件夹从一台计算机转移到另一台计算机。rsync只处理文件更改(比复制快)。

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

总的来说,我认为原生Git解决方案更干净,但这个rsync黑客可能对那些赶时间的人很好,他们可能更熟悉rsync而不是Git。

原文中的启动命令:

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

对我不起作用(出于某种原因,它创建了不可用的补丁文件)。相反,我不得不:

git stash apply stash@{x}
git commit

我想转移的每一笔钱然后,我将'parent' repo放置在` child' repo:///范围内,并对每个stash提交执行以下操作:

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

这个更复杂,但对我来说很管用。

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

办公室

git commit -m "-stash-"

厨房

git reset --soft HEAD~1

如何在SourceTree中导出Stash:

  1. 从你将要使用你的Stash的分支中创建一个新的分支“StashTransfer”
  2. 运用你的积蓄,并做出承诺

  3. 点击你的提交,并从它做一个补丁,把补丁文件与你。

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

  5. Actions / Apply Patch, select Mode: Modify working copy files, push Apply Patch 现在您在当前工作环境

  6. 中有来自补丁的未提交修改
  7. 为当前的回购创建一个新的Stash

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

创建存储作为补丁

$ git stash show "stash@{0}" -p > changes.patch
" stash@{0} "是stash的ref。它将创建补丁文件与最新的stash。 如果你想要不同的一个,使用命令$ git stash list来查看你的存储列表,并选择你想要修补的一个

应用补丁

现在将隐藏文件转移到另一台机器,并将其粘贴到项目的根文件夹中。 执行命令

$ git apply changes.patch

如果出现了错误,而你想要逆转更改

$ git apply changes.patch --reverse

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

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

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

源于原回购的根源:

  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

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

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

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

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

将存储的更改复制到补丁文件

git apply path/to/the/patch/file

应用补丁文件中的stash

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

还要注意使用option -binary存储的本地文件,以及在导出和导入时存储的几个文件。搜索了一段时间后,我做了以下事情。

#检查所有的存储

Git藏匿清单

——option binary对于导出二进制文件很重要

Git隐藏文件:patch0

#import stash,转到新的存储库

Git apply /old_repository/patch0

#然后重新保存本地更改

@{1},…, stash@ {n}