web-dev-qa-db-ja.com

よりスマートなgitプロトコル、sshまたはgit(over ssh)またはhttpsプロトコルはどれですか?

どちらが効率的ですか? SSH://またはGit://(ファイル圧縮)

Gitでは、通信の両端にプロトコルエージェントがあり、ファイル転送を圧縮してネットワーク帯域幅を効率的に使用することでクローンを高速化できるため、gitプロトコルは賢明です。

O'Reillyの本 から、次のステートメントが見つかりました。

For secure, authenticated connections, the Git native 
protocol can be tunneled over an SSH connection using
the following URL templates:

ssh: //[user@]example.com[:port]/path/to/repo.git
ssh: //[user@]example.com/path/to/repo.git
ssh: //[user@]example.com/~user2/path/to/repo.git
ssh: //[user@]example.com/~/path/to/repo.git*

著者が彼の言うことを意味するかどうかはわかりません。彼はgitプロトコルがSSHでトンネリングされることについて話しています。

私の観点からは、gitポート(エージェントポート)に接続しない限り、プロトコルは有効ではありません。また、SSHは単なる非圧縮ファイル転送です。
しかし、著者によると、SSHを使用する場合、gitプロトコルはその上をトンネリングされます。それでは、GITでSSHは賢くなりましたか?

Von C、ご回答ありがとうございます。 「通常、ネットワークプロトコル(HTTPおよびGit)は読み取り専用です」--enable=receive-packでデーモンを実行すると、Gitをrwにできます。

以下は私の懸念です。
。私のユースケースでは、香港でgitサーバーを設定し、サンノゼや他の国でも同様に使用します。そのため、遅延の懸念があるため、ネットワーク上で効率的になりたいです。

だから私の質問は、git clone ssh://user@server/reposlocを使用するときにgitプロトコルの利点も得られますか? O'Reillyの著者の本によると、彼はgitがssh上でトンネリングされることを意味します。サーバーでgitデーモンが実行されていない場合、gitプロトコルはどのように機能しますか。

SSh:// xyzを使用すると、sshプロトコルとgitプロトコルの両方の利点が得られますか?

回答を事前に評価してください。

48
vengateswaran c

このページ の2番目の部分を見てください

唯一の「ダム」プロトコルはストレートHTTPであり、サーバーで特別な作業を必要としません。 git://プロトコルとssh://プロトコルの両方で、git upload-packプロセス(デーモンではありません)は、実行中のクライアントと通信するサーバー上で分岐しますgit fetch-pack。 ssh://とgit://の両方で、「スマート」な通信が得られます。

38
erjiang

2010-2014の更新:

Git 1.6.6+(2010)およびsmart http protocolの実装以来、sshとhttpsは両方とも同等です:

smart http

リポジトリへの読み取り/書き込みアクセスにsshまたはhttpsを使用できるようになりました。
次の方法もあります リモートサーバーがスマートhttpをサポートしているかどうかを検出
プロキシを使用する必要がある場合は、適切な環境変数を追加します。

2015年第3四半期 Yousha Aleayoub 言及 コメント内

GitHub "どのリモートURLを使用すればよいですか?"

https://クローンURLは、パブリックおよびプライベートのすべてのリポジトリで利用できます。
これらはスマートであるため、リポジトリへのアクセス許可に応じて、読み取り専用または読み取り/書き込みアクセスを提供します。

git-http-backend は次のとおりです。

http://およびhttps://プロトコルを介してリポジトリにアクセスするGitクライアントにGitリポジトリのコンテンツを提供する単純なCGIプログラム。
このプログラムは、スマートHTTPプロトコルと下位互換性のないダムHTTPプロトコルの両方を使用したクライアントフェッチと、スマートHTTPプロトコルを使用したプッシュをサポートしています。


元の回答(2010年7月):

Pro Git Book から:

おそらくGitの最も一般的なトランスポートプロトコルはSSHです。
これは、ほとんどの場所でサーバーへのSSHアクセスがすでに設定されているためです。そうでない場合は簡単です。

SSHは、簡単に読み書きできる唯一のネットワークベースのプロトコルでもあります。他の2つのネットワークプロトコル(HTTPとGit)は一般に読み取り専用であるため、ウォッシュされていない大衆が利用できる場合でも、独自の書き込みコマンドにはSSHが必要です。

SSHは認証されたネットワークプロトコルでもあります;ユビキタスであるため、一般に設定と使用が簡単です。

したがって、Gitプロトコルよりも「スマート」ではなく、Gitプロトコルで対応されていない特定の機能を補完するプロトコルです。

Gitプロトコルの欠点は、認証がないことです。 Gitプロトコルがプロジェクトへの唯一のアクセスであることは一般に望ましくありません。
一般に、プッシュ(書き込み)アクセス権を持ち、読み取り専用アクセスにgit://を使用する他のすべてのユーザーに、SSHアクセスとペアリングします

また、ポート9418へのファイアウォールアクセスが必要です。これは、企業のファイアウォールで常に許可されている標準ポートではありません。大きな企業ファイアウォールの背後では、このあいまいなポートは一般的にブロックされています。

(だから私の店では、読み取りアクセスであってもgitだけでなくssh + gitを使用するためにneed:9418 isブロックされています...)

51
VonC

(@erjiangの回答にコメントを追加したかったのですが、StackOverflowの評判が十分でないため許可されません。)

Git 1.6.6以降、HTTPはもはや「バカ」ではないようです。 Git Webサイトのブログ から:

ただし、昨年末(2009年)のバージョン1.6.6のリリース時点で、Gitはgitまたはsshバージョンとほぼ同じくらい効率的にHTTPプロトコルを使用できるようになりました。

3
Xavi

Ssh経由でgitにアクセスすると、gitプロトコルをssh経由でトンネルするだけで、セットアップがより簡単になり、より安全になります。これは、リモートリポジトリにアクセスするための好ましい方法です。

これは、sshメカニズムを介してユーザー認証を強制できるため、実際にはベアgitプロトコルよりも「スマート」です。 gitは、トランスポート層に関係なく、クライアント上ですべての圧縮とそうでないことを行い、サーバー上でそれを解凍します。

「git」サーバーはこれを行いません。これはすべて、sshを使用している場合にも起こります。リモートリポジトリに書き込むことができるようにする場合は、gitサーバーを使用しないでください。読み取り専用アクセスが必要な場合はgitまたはHTTPトランスポートは「OK」ですが、リポジトリに書き込む必要がある開発者がいる場合は、sshを使用する必要があります。 gitサーバー用のトンネルを設定することは、複雑さと構成を追加するだけであり、脆弱で何も得られません。

3
user177800

さまざまなプロトコルは異なるレベル(たとえば、ISO 7レイヤーモデル)にあるため、ワイヤーまたはワイヤレス、またはファイバーで接続できるように、両方を持つことができます。

1
Philip Oakley

から ウィキペディア

SSHトンネルをセットアップするには、指定されたローカルポートをリモートマシンのポートに転送するようにSSHクライアントを構成します。 SSHトンネルが確立されると、ユーザーは指定されたローカルポートに接続してネットワークサービスにアクセスできます。ローカルポートは、リモートポートと同じポート番号である必要はありません。

何らかのASCIIアート表現:

Git Data ---> [SSH encrypts data] ----- Internet -----> [SSH decrypts data] ----> Git Data
1
David Pratte

Gitクローン中にパックファイルをすばやく検索すると、サーバーからクライアントに送信される単一のパックファイルがリストされます。パックファイルは.git/objects/pack/pack-XXXX.packの下にリストされています。サーバーからクライアントに送信されるファイルは、最初に圧縮されます。次に、パックされたコンテンツの単一のコピーがあります。これは、サーバー側でlsof -pとクライアント側でlsof -pを使用して、パックされたファイルを比較するときに見られます。サンプルケースでは、200MBのファイルがサーバーからクライアントにアップロードされます。..

1) Server side 
   lsof -p 8079 | grep pack
   git-uploa 8079  REG  253,2 277896169 5140075 /home/server/work/work0617/.git/objects/pack/pack-492945ae602a975d46df133f6ded9642146fb6a7.pack
   git-uploa 8079  REG  253,2   1703472 5140076 /home/server/work/work0617/.git/objects/pack/pack-492945ae602a975d46df133f6ded9642146fb6a7.idx
   git-uploa 8079  REG  253,2 277896169 5140075 /home/server/work/work0617/.git/objects/pack/pack-492945ae602a975d46df133f6ded9642146fb6a7.pack

2) Client side
   lsof -p 3140 | grep pack
   git     3140  3u   REG    8,1 101031935 3681610 /home/client/work/work0617/work0617/.git/objects/pack/tmp_pack_pRfYPa

 3) The server side pack file 277MB. The file on the client side is 101MB and growing. So a single compressed file is copied over.
1
Sachin Naik