//             Whether the linker should use external linking mode
 //             when using -linkmode=auto with code that uses cgo.
 //             Set to 0 to disable external linking mode, 1 to enable it.
+//     GIT_ALLOW_PROTOCOL
+//             Defined by Git. A colon-separated list of schemes that are allowed to be used
+//             with git fetch/clone. If set, any scheme not explicitly mentioned will be
+//             considered insecure by 'go get'.
 //
 //
 // Import path syntax
 // each is tried in turn when downloading.  For example, a Git
 // download tries https://, then git+ssh://.
 //
+// By default, downloads are restricted to known secure protocols
+// (e.g. https, ssh). To override this setting for Git downloads, the
+// GIT_ALLOW_PROTOCOL environment variable can be set (For more details see:
+// 'go help environment').
+//
 // If the import path is not a known code hosting site and also lacks a
 // version control qualifier, the go tool attempts to fetch the import
 // over https/http and looks for a <meta> tag in the document's HTML
 
 each is tried in turn when downloading.  For example, a Git
 download tries https://, then git+ssh://.
 
+By default, downloads are restricted to known secure protocols
+(e.g. https, ssh). To override this setting for Git downloads, the
+GIT_ALLOW_PROTOCOL environment variable can be set (For more details see:
+'go help environment').
+
 If the import path is not a known code hosting site and also lacks a
 version control qualifier, the go tool attempts to fetch the import
 over https/http and looks for a <meta> tag in the document's HTML
                Whether the linker should use external linking mode
                when using -linkmode=auto with code that uses cgo.
                Set to 0 to disable external linking mode, 1 to enable it.
+       GIT_ALLOW_PROTOCOL
+               Defined by Git. A colon-separated list of schemes that are allowed to be used
+               with git fetch/clone. If set, any scheme not explicitly mentioned will be
+               considered insecure by 'go get'.
        `,
 }
 
 
        resolveRepo func(v *vcsCmd, rootDir, remoteRepo string) (realRepo string, err error)
 }
 
-var isSecureScheme = map[string]bool{
+var defaultSecureScheme = map[string]bool{
        "https":   true,
        "git+ssh": true,
        "bzr+ssh": true,
                // If repo is not a URL, it's not secure.
                return false
        }
-       return isSecureScheme[u.Scheme]
+       return v.isSecureScheme(u.Scheme)
+}
+
+func (v *vcsCmd) isSecureScheme(scheme string) bool {
+       switch v.cmd {
+       case "git":
+               // GIT_ALLOW_PROTOCOL is an environment variable defined by Git. It is a
+               // colon-separated list of schemes that are allowed to be used with git
+               // fetch/clone. Any scheme not mentioned will be considered insecure.
+               if allow := os.Getenv("GIT_ALLOW_PROTOCOL"); allow != "" {
+                       for _, s := range strings.Split(allow, ":") {
+                               if s == scheme {
+                                       return true
+                               }
+                       }
+                       return false
+               }
+       }
+       return defaultSecureScheme[scheme]
 }
 
 // A tagCmd describes a command to list available tags
                                match["repo"] = scheme + "://" + match["repo"]
                        } else {
                                for _, scheme := range vcs.scheme {
-                                       if security == secure && !isSecureScheme[scheme] {
+                                       if security == secure && !vcs.isSecureScheme(scheme) {
                                                continue
                                        }
                                        if vcs.ping(scheme, match["repo"]) == nil {
 
        }
 }
 
+func TestIsSecureGitAllowProtocol(t *testing.T) {
+       tests := []struct {
+               vcs    *vcsCmd
+               url    string
+               secure bool
+       }{
+               // Same as TestIsSecure to verify same behavior.
+               {vcsGit, "http://example.com/foo.git", false},
+               {vcsGit, "https://example.com/foo.git", true},
+               {vcsBzr, "http://example.com/foo.bzr", false},
+               {vcsBzr, "https://example.com/foo.bzr", true},
+               {vcsSvn, "http://example.com/svn", false},
+               {vcsSvn, "https://example.com/svn", true},
+               {vcsHg, "http://example.com/foo.hg", false},
+               {vcsHg, "https://example.com/foo.hg", true},
+               {vcsGit, "user@server:path/to/repo.git", false},
+               {vcsGit, "user@server:", false},
+               {vcsGit, "server:repo.git", false},
+               {vcsGit, "server:path/to/repo.git", false},
+               {vcsGit, "example.com:path/to/repo.git", false},
+               {vcsGit, "path/that/contains/a:colon/repo.git", false},
+               {vcsHg, "ssh://user@example.com/path/to/repo.hg", true},
+               // New behavior.
+               {vcsGit, "ssh://user@example.com/foo.git", false},
+               {vcsGit, "foo://example.com/bar.git", true},
+               {vcsHg, "foo://example.com/bar.hg", false},
+               {vcsSvn, "foo://example.com/svn", false},
+               {vcsBzr, "foo://example.com/bar.bzr", false},
+       }
+
+       os.Setenv("GIT_ALLOW_PROTOCOL", "https:foo")
+       for _, test := range tests {
+               secure := test.vcs.isSecure(test.url)
+               if secure != test.secure {
+                       t.Errorf("%s isSecure(%q) = %t; want %t", test.vcs, test.url, secure, test.secure)
+               }
+       }
+}
+
 func TestMatchGoImport(t *testing.T) {
        tests := []struct {
                imports []metaImport