transport: fix ssh override config, fixes #519
diff --git a/plumbing/transport/ssh/common.go b/plumbing/transport/ssh/common.go
index 6d1c51b..af79dfb 100644
--- a/plumbing/transport/ssh/common.go
+++ b/plumbing/transport/ssh/common.go
@@ -146,11 +146,14 @@
 		return
 	}
 
-	vo := reflect.ValueOf(*overrides)
-	vc := reflect.ValueOf(*c)
-	for i := 0; i < vc.Type().NumField(); i++ {
-		vcf := vc.Field(i)
-		vof := vo.Field(i)
+	t := reflect.TypeOf(*c)
+	vc := reflect.ValueOf(c).Elem()
+	vo := reflect.ValueOf(overrides).Elem()
+
+	for i := 0; i < t.NumField(); i++ {
+		f := t.Field(i)
+		vcf := vc.FieldByName(f.Name)
+		vof := vo.FieldByName(f.Name)
 		if isZeroValue(vcf) {
 			vcf.Set(vof)
 		}
diff --git a/plumbing/transport/ssh/common_test.go b/plumbing/transport/ssh/common_test.go
index da99148..1b07eee 100644
--- a/plumbing/transport/ssh/common_test.go
+++ b/plumbing/transport/ssh/common_test.go
@@ -3,7 +3,39 @@
 import (
 	"testing"
 
+	"golang.org/x/crypto/ssh"
+
 	. "gopkg.in/check.v1"
 )
 
 func Test(t *testing.T) { TestingT(t) }
+
+func (s *SuiteCommon) TestOverrideConfig(c *C) {
+	config := &ssh.ClientConfig{
+		User: "foo",
+		Auth: []ssh.AuthMethod{
+			ssh.Password("yourpassword"),
+		},
+		HostKeyCallback: ssh.FixedHostKey(nil),
+	}
+
+	target := &ssh.ClientConfig{}
+	overrideConfig(config, target)
+
+	c.Assert(target.User, Equals, "foo")
+	c.Assert(target.Auth, HasLen, 1)
+	c.Assert(target.HostKeyCallback, NotNil)
+}
+
+func (s *SuiteCommon) TestOverrideConfigKeep(c *C) {
+	config := &ssh.ClientConfig{
+		User: "foo",
+	}
+
+	target := &ssh.ClientConfig{
+		User: "bar",
+	}
+
+	overrideConfig(config, target)
+	c.Assert(target.User, Equals, "bar")
+}