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


150

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

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

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



3
ベアとノーマルの2つのリモートリポジトリがあり、フックを使用します。面倒に思われるかもしれませんがgit ready公式のgit wikiによれば、ベアリポジトリにプッシュするだけです。これがおそらくほとんどのgit repoホスト(GitHub、Bitbucketなど)にポスト受信フックが含まれているため、たとえばを実行するスクリプトを実行するサーバーのURLにPOSTできますgit pull github master
Jake Berger

回答:


137

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

herokuのようにベアリポジトリを作成せずにプッシュすることは可能ですか
ANinJa 2017

2
@ANinJa分かりません、私の例では正確にそうではありませんか?
Ciro Santilli郝海东冠状病六四事件法轮功

ある--localオプション?
ユクレレ

@Yukulélé --localは現在のディレクトリにのみ--global影響し、ですべてのgitリポジトリに影響し~/.gitconfigますman git-config。を参照してください。
Ciro Santilli郝海东冠状病六四事件法轮功

1
ドキュメントを読んだ後、@ CiroSantilli新疆改造中心六四事件法轮功に感謝します。「(
local

146

最適なオプション

おそらく、最もクリーンで混乱が少なく、最も安全な方法で、非ベアリモートリポジトリにプッシュするには、ラップトップのブランチを表すリモートの専用ブランチにプッシュします。

最も単純なケースを見てみましょう。各レポにマスターが1つだけあると想定します。ラップトップからリモートリポジトリにプッシュするときは、マスター->マスターではなく、マスター->ラップトップマスター(または同様の名前)をプッシュします。この方法では、プッシュはリモートリポジトリの現在チェックアウトされているマスターブランチに影響しません。ラップトップからこれを行うには、コマンドはかなり簡単です:

git push origin master:laptop-master

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

代替オプション

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

マスター->マスターをプッシュするだけの場合、コマンドは次のとおりです。

git push origin

しかし、リモートリポジトリに戻ったときgit reset --hard HEADは、プッシュされたコンテンツと作業ツリーを同期させるためにa を実行したいと思うでしょう。これは危険な場合があります。リモートワークツリーにコミットされていない変更があり、それを保持したい場合は、それらが消去されてしまうためです。これを試す前に、これがどのような結果をもたらすかを理解しておくか、少なくとも最初にバックアップを作成してください。

編集 Git 2.3以降では、「push-to-deploy」git push:https : //github.com/blog/1957-git-2-3-has-been-releasedを使用できます。しかし、別のブランチにプッシュしてからマージするほうが、実際にマージを行うため、通常はより優れています(したがって、マージと同様にコミットされていない変更でも機能します)。


1
ノートパソコンのマスターをプッシュした後、分岐を自動化することは可能ですか?
rdoubleui 2010

3
@rdoubleui:「マージを自動化する」という意味ですか?もしそうなら、いいえ、マージは人間の介入なしに可能であることが保証されていないので、マージを自動化することは不可能です。整理する必要がある競合がある可能性があります。
Dan Molding、

7
それ以降のバージョン(?)では、git config receive.denyCurrentBranch ignore裸でないリポジトリにプッシュする前に実行する必要があります
prusswan

3
素晴らしい回答@DanMoulding、ありがとう。@rdoubleui:あなたは常に、bashの関数として、次のようなコマンドラインを救うことができる:git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
リッチ

@rdoubleuiでマージを自動化するには、gitoliteを使用して設定し(少し複雑)、非ベアコミットをすべてダーティにコミットし、pre-gitトリガーを使用してそれをgitolite(ベア)バージョンにプッシュします。その後、マージが非ベアで解決できない場合は、プッシュを拒否します。そのため、最初にプルし、マージを解決して、もう一度プッシュする必要があることがわかります。私はまだこれを設定していませんが、処理中であり、うまくいくと思います。

17

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

この方法では、サーバーに変更をプッシュしているときに、サーバーの作業リポジトリでチェックアウトされたブランチの状態を気にする必要はありません。


4

もう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

1

できるよ:

$git config --bool core.bare true

これは、ベアリポジトリまたはセントラルリポジトリで実行できるため、ベアリポジトリ以外からプッシュされたすべてのファイルを受け入れます。非ベアリポジトリでこれを行うと、非ベアリポジトリからベアリポジトリにファイルをプッシュできなくなります。

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

$git log 中央レポ。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.