私は通常、Git リポジトリがある ssh (screen と vim) を介してリモート サーバーで作業します。時々私はオンラインではないので、ラップトップに別のリポジトリ (リモートから複製されたもの) があります。
ただし、通常はファイアウォールの内側にいるか、パブリック IP を持っていないため、リモート側でこのリポジトリからプルすることはできません。
ベアリポジトリにのみプッシュする必要があることを読みました。変更をリモート リポジトリにプッシュするにはどうすればよいですか?
私は通常、Git リポジトリがある ssh (screen と vim) を介してリモート サーバーで作業します。時々私はオンラインではないので、ラップトップに別のリポジトリ (リモートから複製されたもの) があります。
ただし、通常はファイアウォールの内側にいるか、パブリック IP を持っていないため、リモート側でこのリポジトリからプルすることはできません。
ベアリポジトリにのみプッシュする必要があることを読みました。変更をリモート リポジトリにプッシュするにはどうすればよいですか?
最良の選択肢
おそらく、裸ではないリモート リポジトリにプッシュする最もクリーンで、混乱が少なく、最も安全な方法は、ラップトップ ブランチを表すリモートの専用ブランチにプッシュすることです。
最も単純なケースを見てみましょう。各レポに master というブランチが 1 つだけあると仮定します。ラップトップからリモート リポジトリにプッシュする場合、master -> master をプッシュする代わりに、master -> laptop-master (または類似の名前) をプッシュします。この方法では、プッシュはリモート リポジトリで現在チェックアウトされているマスター ブランチには影響しません。ラップトップからこれを行うには、コマンドは非常に簡単です。
git push origin master:laptop-master
これは、ローカル マスター ブランチがリモート リポジトリの「laptop-master」という名前のブランチにプッシュされることを意味します。リモート リポジトリには、「laptop-master」という名前の新しいブランチがあり、準備ができたらリモート マスターにマージできます。
代替オプション
単に master -> master をプッシュすることもできますが、何が起こっているのか理解していないと混乱する可能性があるため、現在チェックアウトされている未公開レポのブランチにプッシュすることは一般的に推奨されません。これは、チェックアウトされたブランチにプッシュしても作業ツリーが更新されないためです。そのため、プッシュされたチェックアウトさgit status
れたブランチをチェックインすると、最後にプッシュされたものとは正反対の違いが表示されます。プッシュが行われる前に作業ツリーが汚れていた場合、特に混乱を招きます。これが、これが推奨されない大きな理由です。
master -> master をプッシュするだけの場合、コマンドは次のとおりです。
git push origin
git reset --hard HEAD
しかし、リモート リポジトリに戻ったときに、プッシュされたコンテンツと作業ツリーを同期させるために、おそらく を実行したいと思うでしょう。リモート ワーク ツリーに保持したいコミットされていない変更があると、それらが消去されてしまうため、これは危険な場合があります。試す前に、これがどのような結果をもたらすかを確認するか、少なくとも最初にバックアップを作成してください。
EDIT Git 2.3 以降、「プッシュ ツー デプロイ」 git push を使用できます: https://github.com/blog/1957-git-2-3-has-been-released。ただし、別のブランチにプッシュしてからマージする方が、実際のマージが行われるため、通常はより適切です (したがって、コミットされていない変更はマージと同じように機能します)。
receive.denyCurrentBranch updateInstead
このオプションはGit 2.3で追加され、クリーンな場合はサーバーが作業ツリーを更新するようにします。
したがって、ローカルでプルする前に常にコミットし、サーバー上でクリーンな作業ツリーを維持することを保証する場合 (マージの競合を回避するために行う必要があります)、このオプションは良い解決策です。
使用例:
git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead
cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master
cd ../server
ls
出力:
a
b
サーバーに裸のリポジトリとローカルで動作する (裸ではない) リポジトリを用意することをお勧めします。ラップトップからサーバーのベア リポジトリに変更をプッシュし、そのベア リポジトリからサーバーの作業リポジトリにプルすることができます。私がこれを言う理由は、ラップトップで複製したいサーバーに多くの完全/不完全なブランチがある可能性があるためです。
このようにして、変更をサーバーにプッシュするときに、サーバーの作業レポでチェックアウトされたブランチの状態を心配する必要はありません。
もう 1 つのオプションは、プッシュではなくプルできるようにリバース ssh トンネルをセットアップすることです。
# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote
# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side
そして、トンネルをバックグラウンドで実行したい場合
$ ssh -fNnR 1234:localhost:22 user@remote