Xcodeからhttpでgit pushできなくて困った際の解決方法

Xcodeで開発をしていて、GitBucketにpushしようとしたら出来なくて困ったので解決策を残しておきます。
自身の環境はGitBucketですが、GitHubでもGitLabでも同様だと思います。

## 失敗した状態

こんな感じで`http`でリモートリポジトリの設定をして

![Main_storyboard.png](https://qiita-image-store.s3.amazonaws.com/0/6092/ec04006c-ec81-33f3-b41c-e7a86d163f2d.png)

pushをすると、user/passwordの入力を求められます。

![スクリーンショット_2016_11_30_16_25.png](https://qiita-image-store.s3.amazonaws.com/0/6092/95b103f2-f568-1fd9-bed1-12a1babe3050.png)

正しいuser/passwordを入力しているはずなのに成功せず、Cancelすると認証エラーのメッセージが出てきました。

![スクリーンショット_2016_11_30_16_26.png](https://qiita-image-store.s3.amazonaws.com/0/6092/801fb402-71e6-f9f8-3936-609e2326a4b3.png)

Apacheのログを確認すると、Apacheまでは届いていて、401で返却しています。

```
xx.xxx.xxx.xx - - [30/Nov/2016:16:24:38 +0900] "GET /gitbucket/git/xxxx/xxxx.git/info/refs?service=git-receive-pack HTTP/1.1" 401 1019 "-" "git/1.0 (libgit2 0.24.0)"
```

Stack Overflowを漁っても、あまり良さそうな解決策が無い感じです。
下の記事の方で、`Xcode accepts just ssh://git@my.domain.cz:2222/project-name` と言っていて、ソースは見当たらなかったのですが、sshならイケそうな感じです。

* [git \- Gitlab \- Xcode Can't connect with remote repository \- Stack Overflow](http://stackoverflow.com/questions/20266294/gitlab-xcode-cant-connect-with-remote-repository)
* [git \- Xcode \- Authentication failed error when adding repository with SSH auth \- Stack Overflow](http://stackoverflow.com/questions/37143563/xcode-authentication-failed-error-when-adding-repository-with-ssh-auth)

まずは、そもそもGitBucketの方でSSH接続を許可する設定があるのか確認してみます。

GitBucketに管理者でログインし、`System Settings`を確認すると`Enable SSH access to git repository`という項目が！
チェックボックスにチェックを入れ、GitBucketのサーバのHostとSSHのPortを入力。(Portは特にこだわりが無かったのでそのままに)
SSHアクセスを許可する場合は、Base URLの設定も必要なので、GitBucketのURLを入力して設定を保存します。

![System_Settings.png](https://qiita-image-store.s3.amazonaws.com/0/6092/663ccfce-8870-83dd-e9dc-94f814b43817.png)

ここで設定したSSHのPortで接続できるように、忘れずにFirewallの設定も修正し、restartしておきます。

これでユーザ毎にSSH Keyを登録することができるようになったので、鍵を生成します。(面倒だったのでパスフレーズ無し)

```bash
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tenten0213/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/tenten0213/.ssh/id_rsa.
Your public key has been saved in /Users/tenten0213/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX tenten0213@Mac-mini.local
The key's randomart image is:
+---[RSA 2048]----+
|     ..   o.o.E*%|
|   . ..... o.+ %B|
|    + ..+...o.* *|
|   . + o +.o.o . |
|    o . S + . o  |
|     . o +   o o |
|    . .   o   o  |
|     .   . .     |
|          .      |
+----[SHA256]-----+
```

上記で作成した`id_rsa.pub`の内容をGitBucketに登録します。

![SSH_Keys.png](https://qiita-image-store.s3.amazonaws.com/0/6092/03458d66-79a4-1fba-02d9-9c9692112984.png)

これでpushする準備が整いました。

GitのRemoteのURLはSSHの方に変更しておきます。

![スクリーンショット_2016_11_30_17_05.png](https://qiita-image-store.s3.amazonaws.com/0/6092/5d000a5f-54cb-b8dc-33a3-4148ead3ee0a.png)

これでXcodeからpushをすると、接続先を信頼するかと聞かれるので`Trust`を選択し、

![スクリーンショット_2016_11_30_16_40.png](https://qiita-image-store.s3.amazonaws.com/0/6092/fa24b49c-4d68-100e-29ab-74016f71a41a.png)

パスフレーズ無しで鍵を生成したので、そのまま`OK`とすると、pushが成功します。

![スクリーンショット_2016_11_30_16_41.png](https://qiita-image-store.s3.amazonaws.com/0/6092/01a525c5-2a59-9b59-0d87-ca2cab34dbc3.png)

### 感想

HTTPでpush出来なくて嘘だろ？！と思って色々調べましたが、あまり有用な情報が無く苦労しました。
他のIDE(Eclipse, IntelliJ IDEA) で同様の環境で苦労したことが無かったのでXcode恐るべしって感じです…:skull:
(実はもっと簡単にイケるよ！って情報があればコメントお願いします！！！！)