hidao’s blog

IT系とか読書ログとか。

リモートホストの公開していないポートで待ち受けている Git リポジトリに Push する【Git, SSH, トンネリング】

TL;DR

export REMOTE_GIT_PORT=3389   # ポート番号は任意
ssh -N -L $REMOTE_GIT_PORT:127.0.0.1:$REMOTE_GIT_POT ssh_user@remote_host &

cd /path/to/repository
git remote set-url origin ssh://git@127.0.0.1:$REMOTE_GIT_PORT/git_user/target_repo.git
git push

手順

  1. リモートサーバに SSH で接続できるようにします。サーバによって異なるので手順は割愛します。
  2. リモートサーバの Git が要求するポートを閉じます。今回の場合は 3389 番ポートです。
  3. リモートサーバに Git をインストールします。Git の待ち受けポートを 3389 番に設定します。
  4. ローカル PC より、ssh 経由でリモートサーバの 3389 ポートにアクセスできるように、以下のコマンドを実行します。(SSH Tunnel する)

     # ローカルホストの 3389 番ポート(左側)にアクセスすると、ssh 経由でリモートホストの
     # 3389 番ポート(右側)に接続される。(アクセスするアプリが何であっても)
     ssh -N -L 3389:127.0.0.1:3389 ssh_user@remote_host &
    
  5. 以下のコマンドで git push 先をローカルホスト経由に変更します。3389 はリモートの Git の待ち受けポートに、git_user は Git のユーザアカウント ID に、target_repo.git はコミット先のリポジトリ名にそれぞれご利用の環境に合わせて変更してください。

     git remote set-url origin ssh://git@127.0.0.1:3389/git_user/target_repo.git
    
  6. あとはいつも通り、git push します。初回 Push 時には git push -u origin master とする必要があるかもしれません。

     git push
    
  7. このままではローカルホストの 3389 番へのアクセスおよびローカルホスト経由の別の SSH トンネルが利用できなくなるので、利用後は速やかにバックグラウンド起動している ssh コマンドを終了させましょう。 別端末で ssh をフォアグラウンド起動しておき、Push した後 Ctrl-C するのが簡単かもしれません。

なぜこんなややこしいことをしているのか

Github 的なイシュートラッカーと Git がどこからでもアクセスできるようにしたいよね! でもインターネットにリポジトリ&イシュートラッカー公開したくないので、仲間内だけに SSH 秘密鍵を渡して遠隔地のサークルメンバとリポジトリを共有したいよね!」っていうのが動機です。

素直に Github や bitbucket 使えばいい? はい、その通りです…😓

検証環境

VPSサービス: conoha VPS リモートOS: CentOS7 Docker: 1.13.1 giteaコンテナ: gitea/gitea

ローカルOS: Windows10 バージョン 1903 Git for Windows: 2.19.1