Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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 getgit+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構造体定義に対する変更を示しています。

  1. vcsGit (Git):

    -	scheme:  []string{"git", "https", "http"},
    +	scheme:  []string{"git", "https", "http", "git+ssh"},
    

    Gitのschemeリストに"git+ssh"が追加されました。これにより、go getgit+ssh://で始まるURLをGitリポジトリとして認識し、Gitコマンド(例: git clone git+ssh://user@host/repo.git)を呼び出してリポジトリを操作できるようになります。

  2. vcsBzr (Bazaar):

    -	scheme:  []string{"https", "http", "bzr"},
    +	scheme:  []string{"https", "http", "bzr", "bzr+ssh"},
    

    Bazaarのschemeリストに"bzr+ssh"が追加されました。これにより、go getbzr+ssh://で始まるURLをBazaarリポジトリとして認識し、Bazaarコマンド(例: bzr branch bzr+ssh://user@host/repo)を呼び出してリポジトリを操作できるようになります。

  3. vcsSvn (Subversion):

    -	scheme:  []string{"https", "http", "svn"},
    +	scheme:  []string{"https", "http", "svn", "svn+ssh"},
    

    Subversionのschemeリストに"svn+ssh"が追加されました。これにより、go getsvn+ssh://で始まるURLをSubversionリポジトリとして認識し、Subversionコマンド(例: svn checkout svn+ssh://user@host/repo)を呼び出してリポジトリを操作できるようになります。

これらの変更は、go getコマンドがSSHを介したVCSリポジトリへのアクセスをネイティブにサポートするための基盤を確立しました。これにより、ユーザーはプライベートなGitLab、Bitbucket Server、または自社ホスティングのVCSリポジトリから、SSH鍵認証を利用してGoパッケージを簡単に取得できるようになりました。

関連リンク

参考にした情報源リンク