web-dev-qa-db-ja.com

git stashをリモートリポジトリにプッシュすることはできますか?

Gitでは、スタッシュを作成し、スタッシュをリモートリポジトリにプッシュし、別のコンピューターでスタッシュを取得して、スタッシュを適用できますか?

または私のオプションは次のとおりです。

  • パッチを作成して、パッチを他のコンピューターにコピーするか、または
  • マイナーなブランチを作成し、そのブランチに不完全な作業をコミットしますか?
180
Andrew Grimm

Fetchなどで取得することはできません。ミラーrefspecはfetch = +refs/*:refs/*であり、stashがrefs/stashであっても送信されません。明示的なrefs/stash:refs/stashも効果がありません!

いずれにしても、すべてのスタッシュをフェッチするわけではなく、最新のものだけをフェッチするため、とにかく混乱を招くだけです。隠し場所のリストは、参照refs/stashesの-​​reflogです。

60
u0b34a0f6ae

注:ベルトの下に24時間のgit-fuを追加してこの回答を書き直しました。しかし、あなたの便宜のためにそれらを凝縮していません。

このようにして、盲目的にコピー/ペーストするだけでなく、あなたが私がどのようにしたかを見ることができることを願っています。


手順は次のとおりです。

隠し場所を含む〜/ OLDREPOのソースを想定しています。スタッシュを含まないTESTクローンを作成します。

cd ~/OLDREPO
git clone . /tmp/TEST

すべてのスタッシュを一時ブランチとしてプッシュします。

git send-pack /tmp/TEST $(for sha in $(git rev-list -g stash); \
    do echo $sha:refs/heads/stash_$sha; done)

受信側でループしてスタッシュに変換します。

cd /tmp/TEST/
for a in $(git rev-list --no-walk --glob='refs/heads/stash_*'); 
do 
    git checkout $a && 
    git reset HEAD^ && 
    git stash save "$(git log --format='%s' -1 HEAD@{1})"
done

一時的なブランチをクリーンアップします

git branch -D $(git branch|cut -c3-|grep ^stash_)

Git stashリストを実行すると、次のようになります。

stash@{0}: On (no branch): On testing: openmp import
stash@{1}: On (no branch): On testing: zfsrc
stash@{2}: On (no branch): WIP on sehe: 7006283 fixed wrong path to binary in debianized init script (reported as part of issue
stash@{3}: On (no branch): WIP on debian-collab: c5c8037 zfs_pool_alert should be installed by default
stash@{4}: On (no branch): WIP on xattrs: 3972694 removed braindead leftover -O0 flag
stash@{5}: On (no branch): WIP on testing: 3972694 removed braindead leftover -O0 flag
stash@{6}: On (no branch): WIP on testing: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{7}: On (no branch): WIP on xattrs: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{8}: On (no branch): WIP on testing: 28716d4 fixed implicit declaration of stat64
stash@{9}: On (no branch): WIP on emmanuel: bee6660 avoid unrelated changes

元のリポジトリでは、同じように見えました

stash@{0}: WIP on emmanuel: bee6660 avoid unrelated changes
stash@{1}: WIP on testing: 28716d4 fixed implicit declaration of stat64
stash@{2}: WIP on xattrs: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{3}: WIP on testing: db9f77e Fuse_unmount_all could be starved for the mtx lock
stash@{4}: WIP on testing: 3972694 removed braindead leftover -O0 flag
stash@{5}: WIP on xattrs: 3972694 removed braindead leftover -O0 flag
stash@{6}: WIP on debian-collab: c5c8037 zfs_pool_alert should be installed by default
stash@{7}: WIP on sehe: 7006283 fixed wrong path to binary in debianized init script (reported as part of issue #57)
stash@{8}: On testing: zfsrc
stash@{9}: On testing: openmp import
70
sehe

私はパーティーに少し遅れていますが、私はこれに関して私のために働く何かを見つけたと信じています、そしてあなたの状況が同じか類似している場合、それはあなたにとってもかもしれません。

私は独自のブランチで機能に取り組んでいます。ブランチはmasterにマージされず、終了するまでプッシュされることはありません。コミットを行って、公開しても問題ないと感じています。そのため、ステージングされていない変更を別のコンピューターに転送したい場合は次のようにします。

  • [non-commit] FOR TRANSFER ONLY」のようなコミットメッセージを使用して、転送したいコンテンツを含むコミットを行います。
  • 他のコンピューターにログインします。
  • それから:

    git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb

    別の方法でリポジトリにアクセスすると、URLが異なる場合があります。これにより、そのURLからの変更がリモートブランチ「rb」からローカルブランチ「lb」にプルされます。私は自分のコンピューターでsshサーバーを実行しており、その方法でリポジトリにアクセスできることに注意してください。

  • git reset HEAD^--mixedを意味します)

    これにより、HEADがリセットされ、「[non-commit]」コミットの前の状態がポイントされます。

Git-reset(1)から: "--mixed:インデックスをリセットしますが、作業ツリーはリセットしません(つまり、変更したファイルは保存されますが、コミット用にマークされません)[...]"

そのため、最終的にファイルに対する変更が行われますが、マスターへのコミットは行われず、スタッシュは不要です。

ただし、このコミットはゴミであるため、「[非コミット]」を作成したリポジトリでgit reset --hard HEAD^する必要があります。

30
Victor Zamanian

少し遅れていますが、この答えは誰かを助けるかもしれません。これを知りたかったのは、進行中の機能/バグ/その他をプッシュし、別のコンピューターで同じポイントから作業できるようにしたかったからです。

私にとって有効なのは、進行中のコードをコミットすることです(私が単独で作業しているブランチで)。他のコンピューターにアクセスしたら、プルを実行してから、コミットを取り消します:

git reset --soft HEAD^

進行中のすべての変更をコミットせずにステージングして、元のまま作業を続けます。

それが役に立てば幸い。

18
Sir Robert

これを解決するための非常に巧妙なトリックがあるようです。 git diff > file.diff(およびファイルのコミット)を使用してから、git apply file.diff(どこからでも)を使用して変更を復元し、同じ結果を得ることができます。

これは こちら でも説明されました。

15
Daniel Dubovski

私は2番目のアプローチに行きますが、なぜあなたがそれをmaster/featuredブランチにコミットできないのか分かりません。チェリーピッキングも可能です。

9
Eimantas

スタッシュの全体的なアイデアは、あまり重要ではないものをlocalカーペットの下に隠すことです。誰もあなたのお気に入りのがらくたについて知る必要はありません;-)唯一の「しかし」は次のとおりです。 scpの方がはるかに優れています。

3
argent_smith

以下はstashでは動作しませんが、作業ディレクトリのコミットされていない変更では動作します。ブランチを作成し、現在のすべての変更を自動コミットし、リモートにプッシュします。

commit_and_Push_ ( ) {
    # This will:
    #  1. checkout a new branch stash-XXX
    #  2. commit the current changes in that branch
    #  3. Push the branch to the remote
    local locbr=${1:-autostash-XXX}
    git checkout -b $locbr
    git add .
    git commit -a -m "Automatically created commit"
    git Push Origin $locbr
    echo "Autocommitted changes in branch $locbr ..."
}

次のように使用します:

commit_and_Push_ my-temp-branch
commit_and_Push_
0
dangonfast