stashを別のコンピューターにエクスポートする


296

隠された変更を別のコンピューターにエクスポートする方法が必要です。

Computer1で

$ git stash save feature

stashパッチをファイルに取得し、それを別のコンピューターにインポートしようとしています

$ git stash show -p > patch

このコマンドにより、このリポジトリが複製された別のコンピューターに移動できるファイルが得られますが、問題は、それをstashとして再度インポートする方法です。

ありがとう


6
fyi git stash saveは非推奨になりましたgit stash push
Ewan

回答:


290

実行するだけで、パッチファイルを適用できます(まだ変更をコミットする必要はありません)。

git apply patchfile

次に、現在の作業ディレクトリから新しいスタッシュを作成するだけです。

git stash

2
@マルセロA:承知しました。ただし、回答の投票番号の下にある大きなチェックマークをクリックして、承認した回答にマークを付けてください。このようにして、質問は解決済みとしてマークされます。
2010年

2
システムがOPに回答を「受理済み」とマークさせるのは、質問が出されてからしばらく(15分と思う)経過するまでです。
グレッグヒューギル

23
この回答を読んだ後、私が疑問に思ったことの1つは、すべての隠し場所から特定の隠し場所をどのように選択するかということでした。それに対する答えはここにあります:stackoverflow.com/a/1910142/1148702。この場合、結局git stash show "stash@{0}" -p > patch、OPの2番目のシェルコマンドの代わりに、
ティムキャンバー、

1
@TimCamber私はあなたが二重引用符を必要とするとは思わないstash@{0}..
ari gold

2
@arigold使用しているシェルによって異なります。たとえば、PowerShellでは、中括弧は特別な構文なので必要です。
2017

18

または、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の隠し場所が適用されますgit cherry-pick --no-commitを使用できます


computer1とcomputer2の間に直接接続がない場合。リモート(githubなど)を使用できます。

git push origin stashed_changes_branch

そしてcomputer2で:

git fetch

1
これは、ソースシステム(computer1)が外部接続を受け入れるために開いていることを前提としています。ブランチルートに移動したい場合は、tempブランチをリモートオリジンにプッシュして、computer2からプルしませんか?リモートブランチを保持したくない場合は、プルした直後にリモートブランチを削除できます。gitのブランチは非常に安価なので、通常、使用しない理由はほとんどありません。
不可分

@indivisible今日、インターネット上で2台のコンピューターを接続する機会はたくさんあると思います。回答で説明されている手法は、進行中の作業をラップトップからLAN上のデスクトップに転送するのに役立ちます。Hamachiのような仮想VPNサービスでさえ、Gitを実行しているコンピューター間でインターネットを介して直接ファイルを転送するために使用されます。
2017

1
@steampowered、確かに一部の人々/状況には当てはまるかもしれませんが、このソリューションが機能し、ローカル環境を変更して着信トラフィックを受け入れるようにすることは簡単な構成ではないので、将来の読者にとっては注目に値する点だと思いました私の意見では、これはこのようなタスクの "やり過ぎ"です。システムがすでに開いている場合は、必ずこの回答を使用してください-間違いではありません。ここに降り立つ大多数のユーザーはそのような状況にはならないでしょう。
不可分

シュタッシュはコミットオブジェクトであり、したがって既にコミットハッシュを持っているため(を参照git stash list --oneline)、技術的にはスタッシュを新しいコミットオブジェクトに適用する必要はありません。つまり、新しいブランチを作成する必要はありません。ただし、隠し場所を直接リモートにプッシュすることは控えめに言ってもトリッキーです。
タイラークロンプトン2017

15

または、次のように、ローカルスタッシュ全体を別のコンピューターにエクスポートできます。

  • git pull 古いgitディレクトリと新しいgitディレクトリの両方で、両方に最新の変更があることを確認します。
  • 古いgitディレクトリから新しいリポジトリに.gitフォルダーをコピーする

1
.gitの圧縮tarは700M +でしたが、特に複数の隠し場所があるため、これは他の提案されたソリューションよりもはるかに簡単であることがわかりました。
クリスウォース

5

SourceTreeでStashをエクスポートする方法:

  1. Stashを使用するブランチから新しいブランチ「StashTransfer」を作成します
  2. あなたの隠し場所をそれに適用し、コミットを行います

  3. コミットをクリックしてパッチを作成し、パッチファイルを手元に用意します。

  4. 別のリポジトリに移動し、1)で使用したのと同じ親ブランチを選択します。

  5. アクション/パッチの適用、モードの選択:作業コピーファイルの変更、パッチの適用のプッシュ現在の作業環境で、パッチからの変更がコミットされていません。

  6. 現在のリポジトリの新しいStashを作成します


4

あるマシンから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

3

別のオプションは、あるコンピューターから別のコンピューターへrsync.gitフォルダーです。 rsyncファイルの変更のみを処理します(コピーより高速)。

このアプローチの欠点の1つは、構成も上書きされることです。これは、2つのマシン間で異なる.git構成を実行する場合には望ましくない場合があります。しかし、の--excludeオプションを使用してファイルを除外することで、これを克服できますrsync

全体として、ネイティブのGitソリューションの方がクリーンだと思いますが、このrsyncハックは、gitよりもrsyncに慣れている可能性がある急いでいる人にとってはいいかもしれません。


3

元の投稿の起動コマンド:

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

私にはうまくいきませんでした(何らかの理由で使用できないパッチファイルが作成されました)。代わりに:

git stash apply stash@{x}
git commit

私が移したかった各隠し場所について。次に、「親」リポジトリを「子」リポジトリのfile:///リーチ内に配置し、各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

これはもっと複雑ですが、私にとってはトリックでした。


0

あるマシンから別のマシンに変更を移動する場合は、常にマシンで変更をコミットしてから、そのマシンでソフトリセットを実行できます。

オフィス

git commit -m "-stash-"

キッチン

git reset --soft HEAD~1


0

stashは、ベースコミットとインデックスの間の作業ツリーの特別なマージコミットです。1つの方法は、それぞれを個別のパッチとして保存し、stashの最初の親をチェックアウトし、2つのパッチからインデックスと作業ツリーを復元して、最後にstashを復元することです(1つの答えはこのように思われます)。

これは、スタッシュからすべての情報を完全に再作成するために必要です。コンフリクトを回避し、スタッシュが作成された場所を追跡するために、復元する前にスタッシュの最初の親を少なくともチェックアウトする必要があることを気にしない場合。

これは、すべての隠し場所を1つのリポジトリから別のリポジトリに完全に復元するために行ったものです。それらを同じコンピューター上に配置できない場合は、stashタグを作成後にバンドルに保存し、参照リストとバンドルをターゲットコンピューターにコピーできます。

元のリポジトリのルートから:

  1. stash refのリストを取得する
  2. stash refにタグを付けて、git fetchで取得できるようにします(タグ名は重要ではなく、競合がある場合は変更します。stash_論理stash refで+の数を使用しました)
  3. 論理参照をsha1ハッシュに逆の順序で変換します-後で使用します
  4. そのレポパスを保存します-後でも
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD

注:これにはbashまたは互換シェルが必要です(ksh、zshが実行する必要があります...)stash_$((i++))シェルがサポートしていない場合など、変数をインクリメントすることもできます。${param//pattern}

これで、新しいレポで、各参照について:

  1. 古いリポジトリから参照をフェッチします(タグ名を使用する必要はありません。タグを付けたので、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.