[インデックス 12571] ファイルの概要
このコミットは、Go言語のツールチェインの一部であるcmd/go
、具体的にはバージョン管理システム(VCS)との連携を司るsrc/cmd/go/vcs.go
ファイルに対する変更です。このファイルは、go get
コマンドがGit、Bazaar (Bzr)、Subversion (Svn) といった様々なVCSリポジトリからソースコードを取得する際に、どのプロトコルスキームをサポートするかを定義しています。
コミット
このコミットは、Go言語のgo get
コマンドが、SSHトンネルを介したBazaar (Bzr)、Git、およびSubversion (Svn) リポジトリからの取得を可能にするための変更です。これにより、プライベートなホスティング環境や共同作業環境でよく利用されるSSHベースのアクセスがサポートされるようになります。
- コミットハッシュ:
d13b24598f3f63db601ac2e0caf3d66fc7431380
- 作者: Ingo Oeser nightlyone@googlemail.com
- コミット日時: 2012年3月12日 月曜日 14:41:01 -0400
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d13b24598f3f63db601ac2e0caf3d66fc7431380
元コミット内容
cmd/go: allow ssh tunnelled bzr, git and svn
This is often used in private hosting and collaborating environments.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5753063
変更の背景
Go言語のgo get
コマンドは、指定されたパスに対応するGoパッケージのソースコードをリモートリポジトリから取得し、ローカルに配置する機能を提供します。初期のgo get
は、主に公開されているリポジトリ(GitHub、Bitbucketなど)へのHTTP/HTTPSアクセスや、VCS固有のプロトコル(git://
など)を想定していました。
しかし、企業内ネットワークやプライベートな開発環境では、セキュリティ上の理由やアクセス制御のために、SSH(Secure Shell)を介したリポジトリアクセスが一般的に利用されます。例えば、Gitではgit@github.com:user/repo.git
のようなSSH形式のURLが使われます。
このコミットが行われた2012年当時、go get
がこれらのSSHトンネルされたVCSスキーム(git+ssh://
, bzr+ssh://
, svn+ssh://
)を直接認識していなかったため、プライベートリポジトリからの取得が困難でした。この変更は、このようなプライベートなホスティングおよび共同作業環境におけるgo get
の利便性と実用性を向上させることを目的としています。SSHを介したアクセスを許可することで、より多くの開発シナリオに対応できるようになります。
前提知識の解説
1. go get
コマンド
go get
はGo言語の標準ツールチェーンに含まれるコマンドで、リモートリポジトリからGoパッケージのソースコードをダウンロードし、GOPATH
(Go 1.11以降はGo Modulesのキャッシュ)に配置します。これにより、依存関係の管理とプロジェクトのビルドが容易になります。go get
は内部的に、指定されたURLスキームに基づいて適切なバージョン管理システム(Git, Mercurial, Subversionなど)を呼び出します。
2. バージョン管理システム (VCS)
VCSは、ソフトウェア開発におけるソースコードやその他のファイルの変更履歴を管理するためのシステムです。主要なVCSには以下があります。
- Git: 分散型VCSのデファクトスタンダード。ローカルに完全なリポジトリのコピーを持つ。
- Bazaar (Bzr): 分散型VCSの一つ。Pythonで書かれている。
- Subversion (Svn): 集中型VCS。中央リポジトリにすべての履歴が保存される。
3. SSH (Secure Shell) と SSHトンネリング
SSHは、ネットワークを介して安全にコンピュータを操作するためのプロトコルです。暗号化された通信路を提供し、リモートコマンド実行、ファイル転送(SCP, SFTP)、ポートフォワーディング(トンネリング)などが可能です。
SSHトンネリングとは、SSH接続を介して他のネットワークプロトコルをカプセル化し、安全に通信する技術です。VCSの文脈では、git+ssh://
のように、VCSプロトコル(Gitプロトコルなど)をSSH接続上で実行することで、認証や暗号化の恩恵を受けながらリポジトリにアクセスします。これにより、ファイアウォールを越えたり、公開鍵認証を利用してパスワードなしで安全にアクセスしたりすることが可能になります。
4. VCSにおけるURLスキーム
VCSは、リポジトリの場所を指定するために様々なURLスキームを使用します。
http://
/https://
: HTTP/HTTPSプロトコルを使用。Webサーバー経由でリポジトリにアクセス。認証は通常、ユーザー名とパスワード。git://
: Gitプロトコルを使用。認証なしで高速なアクセスが可能だが、通常は読み取り専用。ssh://
: SSHプロトコルを直接使用。ssh://user@host/path/to/repo
のような形式。git+ssh://
/bzr+ssh://
/svn+ssh://
: これは、特定のVCSプロトコルがSSHトンネルを介して実行されることを示す慣習的なスキームです。例えば、git+ssh://
は、GitプロトコルがSSH接続上で動作することを意味します。これは、ssh://
スキームと似ていますが、VCSクライアントが内部的にSSHを呼び出す方法をより明示的に示すために使われることがあります。
技術的詳細
src/cmd/go/vcs.go
ファイルは、go get
コマンドがサポートする各バージョン管理システム(Git, Bazaar, Subversion, Mercurialなど)の動作を定義する中心的な場所です。このファイルでは、各VCSに対応するvcsCmd
構造体のインスタンスが定義されています。
vcsCmd
構造体は、以下のようなフィールドを持ちます(関連部分のみ抜粋):
type vcsCmd struct {
name string // VCSの名前 (e.g., "git")
cmd string // VCSコマンドの実行ファイル名 (e.g., "git")
scheme []string // このVCSがサポートするURLスキームのリスト
pingCmd string // リポジトリの存在確認に使用するコマンド
createCmd string // リポジトリをクローン/チェックアウトするコマンド
downloadCmd string // リポジトリを更新するコマンド
tagSyncCmd string // 特定のタグに同期するコマンド
tagSyncDefault string // デフォルトのタグ同期コマンド
}
このコミットで変更されたのは、vcsGit
, vcsBzr
, vcsSvn
の各vcsCmd
インスタンス内のscheme
フィールドです。scheme
フィールドは、go get
がリポジトリURLを解析する際に、そのURLがどのVCSによって処理されるべきかを判断するために使用されます。
具体的には、以下のスキームが追加されました。
git+ssh
: GitリポジトリへのSSHトンネル経由のアクセスを明示的にサポートします。bzr+ssh
: BazaarリポジトリへのSSHトンネル経由のアクセスを明示的にサポートします。svn+ssh
: SubversionリポジトリへのSSHトンネル経由のアクセスを明示的にサポートします。
これらのスキームがscheme
リストに追加されることで、go get
はgit+ssh://
, bzr+ssh://
, svn+ssh://
で始まるリポジトリURLを正しく認識し、それぞれGit、Bazaar、Subversionのコマンドを呼び出して、SSH経由でのリポジトリ操作(クローン、更新など)を実行できるようになります。
内部的には、go get
はこれらのスキームを持つURLを受け取ると、対応するVCSコマンド(例: git clone git+ssh://...
)を実行します。この際、SSHクライアント(ssh
コマンド)が自動的に呼び出され、SSH鍵や設定(~/.ssh/config
など)に基づいて認証と安全な通信が確立されます。
コアとなるコードの変更箇所
diff --git a/src/cmd/go/vcs.go b/src/cmd/go/vcs.go
index dee7cec37d..642a89f891 100644
--- a/src/cmd/go/vcs.go
+++ b/src/cmd/go/vcs.go
@@ -104,7 +104,7 @@ var vcsGit = &vcsCmd{
tagSyncCmd: "checkout {tag}",
tagSyncDefault: "checkout origin/master",
- scheme: []string{"git", "https", "http"},
+ scheme: []string{"git", "https", "http", "git+ssh"},
pingCmd: "ls-remote {scheme}://{repo}",
}
@@ -123,7 +123,7 @@ var vcsBzr = &vcsCmd{
tagSyncCmd: "update -r {tag}",
tagSyncDefault: "update -r revno:-1",
- scheme: []string{"https", "http", "bzr"},
+ scheme: []string{"https", "http", "bzr", "bzr+ssh"},
pingCmd: "info {scheme}://{repo}",
}
@@ -138,7 +138,7 @@ var vcsSvn = &vcsCmd{
// There is no tag command in subversion.
// The branch information is all in the path names.
- scheme: []string{"https", "http", "svn"},
+ scheme: []string{"https", "http", "svn", "svn+ssh"},
pingCmd: "info {scheme}://{repo}",
}
コアとなるコードの解説
上記の差分は、src/cmd/go/vcs.go
ファイル内の3つのvcsCmd
構造体定義に対する変更を示しています。
-
vcsGit
(Git):- scheme: []string{"git", "https", "http"}, + scheme: []string{"git", "https", "http", "git+ssh"},
Gitの
scheme
リストに"git+ssh"
が追加されました。これにより、go get
はgit+ssh://
で始まるURLをGitリポジトリとして認識し、Gitコマンド(例:git clone git+ssh://user@host/repo.git
)を呼び出してリポジトリを操作できるようになります。 -
vcsBzr
(Bazaar):- scheme: []string{"https", "http", "bzr"}, + scheme: []string{"https", "http", "bzr", "bzr+ssh"},
Bazaarの
scheme
リストに"bzr+ssh"
が追加されました。これにより、go get
はbzr+ssh://
で始まるURLをBazaarリポジトリとして認識し、Bazaarコマンド(例:bzr branch bzr+ssh://user@host/repo
)を呼び出してリポジトリを操作できるようになります。 -
vcsSvn
(Subversion):- scheme: []string{"https", "http", "svn"}, + scheme: []string{"https", "http", "svn", "svn+ssh"},
Subversionの
scheme
リストに"svn+ssh"
が追加されました。これにより、go get
はsvn+ssh://
で始まるURLをSubversionリポジトリとして認識し、Subversionコマンド(例:svn checkout svn+ssh://user@host/repo
)を呼び出してリポジトリを操作できるようになります。
これらの変更は、go get
コマンドがSSHを介したVCSリポジトリへのアクセスをネイティブにサポートするための基盤を確立しました。これにより、ユーザーはプライベートなGitLab、Bitbucket Server、または自社ホスティングのVCSリポジトリから、SSH鍵認証を利用してGoパッケージを簡単に取得できるようになりました。
関連リンク
- Go言語の公式ドキュメント:
go get
コマンドに関する詳細情報 - このコミットのGo Gerrit Code Reviewへのリンク:
参考にした情報源リンク
- Git公式ドキュメント: GitプロトコルとSSH
- SSHに関する一般的な情報源
- Bazaar公式ドキュメント: BazaarのURLスキーム
- Subversion公式ドキュメント: SubversionのURLスキーム
- Go言語のソースコード:
src/cmd/go/vcs.go
(コミット時点のバージョン)