web-dev-qa-db-ja.com

非ベアGitリポジトリにプッシュする方法は?

私は通常、Gitリポジトリがあるssh(画面とvim)を介してリモートサーバーで作業します。時々私はオンラインではないので、ラップトップに別のリポジトリ(リモートからクローンされた)があります。

ただし、通常はファイアウォールの内側にいるか、パブリックIPがないため、リモート側でこのリポジトリからプルすることはできません。

むき出しのリポジトリにプッシュする必要があることを読みました。次に、変更をリモートリポジトリにプッシュする方法を教えてください。

136
woky

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つだけあるとします。マスター->マスター、プッシュマスター->ラップトップマスター(または同様の名前)をプッシュする代わりに、ラップトップからリモートリポジトリにプッシュする場合。このように、プッシュはリモートリポジトリで現在チェックアウトされているマスターブランチに影響しません。ラップトップからこれを行うには、コマンドは非常に簡単です。

git Push Origin master:laptop-master

これは、ローカルマスタブランチがリモートリポジトリの「laptop-master」という名前のブランチにプッシュされることを意味します。リモートリポジトリには、「laptop-master」という名前の新しいブランチがあり、準備ができたらリモートマスターにマージできます。

代替オプション

Master-> masterだけをプッシュすることもできますが、何が起こっているのか理解していないと混乱を招く可能性があるため、通常、現在チェックアウトされていない非リポジトリのブランチにプッシュすることはお勧めできません。これは、チェックアウトされたブランチにプッシュしても作業ツリーが更新されないため、git statusプッシュされたチェックアウトされたブランチでは、最後にプッシュされたものとは正反対の違いが表示されます。プッシュが行われる前に作業ツリーが汚れていた場合、特に混乱が生じます。これが推奨されない大きな理由です。

マスター->マスターをプッシュするだけの場合、コマンドは次のようになります。

git Push Origin

ただし、リモートリポジトリに戻るときは、git reset --hard HEADプッシュされたコンテンツと同期して作業ツリーを取得します。 これは危険な可能性があります、リモートワークツリーに保持したい未確定の変更がある場合、それを維持したいのでそれらを消去しますでる。試してみる前に、この結果がどのようなものかを必ず確認するか、少なくとも最初にバックアップを作成してください。

[〜#〜] edit [〜#〜]Git 2.3以降では、「プッシュデプロイ」git Pushを使用できます。 https://github.com/blog/1957-git-2-3-has-been-released 。しかし、別のブランチにプッシュしてからマージすると、実際のマージが行われるため、通常はより適切です(したがって、マージと同様にコミットされていない変更でも機能します)。

142
Dan Moulding

私はあなたのサーバーに裸のリポジトリとローカルで動作する(裸でない)リポジトリを持っていることをお勧めします。変更をラップトップからサーバーのベアリポジトリにプッシュしてから、そのベアリポジトリからサーバーの作業リポジトリにプルすることができます。私がこれを言う理由は、あなたがラップトップで複製したいと思う多くの完全/不完全なブランチをサーバーに持っているかもしれないからです。

これにより、サーバーに変更をプッシュする際に、サーバーの作業リポジトリでチェックアウトされたブランチの状態を心配する必要がなくなります。

16
Manish

もう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
4
Todd Freed

できるよ:

$git config --bool core.bare true

これは、ベアリポジトリまたは中央リポジトリで実行できるため、非ベアリポジトリからプッシュされたファイルをすべて受け入れることができます。非ベアリポジトリでこれを行うと、非ベアリポジトリからベアリポジトリにファイルをプッシュできません。

PCで中央リポジトリと非ベアリポジトリを作成してGITを実践している場合、一部のPCでプッシュされたファイルが表示されないことがありますが、プッシュされています。実行して確認できます。

$git log中央レポ。

GitHubにプッシュした場合を除き、そこにファイルが表示されます。

1
vidwan reddy