web-dev-qa-db-ja.com

gittoriousをミラーとして使用するためにgit Pushでgit内で使用するSSHキーを指定する方法は?

Git.debian.org(alioth)でホストされているプロジェクトがあり、 http://gitorious.org のリポジトリのミラーを更新するためにpost-receiveフックを設定したい

git Push --mirror gitoriousを使用する必要があると思います

次に、プッシュを成功させるために、Aliothに権限を与える必要があります。それ、どうやったら出来るの?

私はユーザーをgitoriousに設定し、そのためのsshキーを作成する必要があると思います。そして、受信後フックでgit Pushを実行するとき、このsshキーが使用されていることを確認してください。

~/.ssh/configを使用できますが、問題は多くのユーザーがaliothをプッシュできるため、誰もがログインして~/.ssh/configを構成する必要があることです。代わりに、使用するキーをsshに指示するコマンドラインオプションまたは環境変数が必要です。それをしてもいいですか?

また、ミラーリングを実現する方法は他にもありますか?そして、それを他の方法で設定することは可能ですか?

39
Mildred

答えは gitリファレンスマニュアル にあります。

GIT_SSH

この環境変数が設定されている場合、git fetchおよびgit Pushは、リモートシステムに接続する必要がある場合、sshの代わりにこのコマンドを使用します。 $GIT_SSHコマンドには、正確に2つの引数が与えられます。URLからのusername @ Host(または単にHost)と、そのリモートシステムで実行するシェルコマンドです。

GIT_SSHにリストするプログラムにオプションを渡すには、プログラムとオプションをシェルスクリプトにラップし、GIT_SSHを参照するように設定する必要があります。シェルスクリプト

通常、個人の.ssh/configファイルを使用して必要なオプションを構成する方が簡単です。詳細については、sshのドキュメントを参照してください。

そのため、ラッパースクリプトを記述する必要があります。次のPush-gitorious.shスクリプトを記述します。

#!/bin/sh


if [ "run" != "$1" ]; then
  exec ssh -i "$GITORIOUS_IDENTITY_FILE" -o "StrictHostKeyChecking no" "$@"
fi

remote=YOUR_SSH_GITORIOUS_URL

echo "Mirroring to $remote"

export GITORIOUS_IDENTITY_FILE="`mktemp /tmp/tmp.XXXXXXXXXX`"
export GIT_SSH="$0"

cat >"$GITORIOUS_IDENTITY_FILE" <<EOF
YOUR SSH PRIVATE KEY

EOF
cat >"$GITORIOUS_IDENTITY_FILE.pub" <<EOF
YOUR SSH PUBLIC KEY

EOF

#echo git Push --mirror "$remote"
git Push --mirror "$remote"

rm -f "$GITORIOUS_IDENTITY_FILE"
rm -f "$GITORIOUS_IDENTITY_FILE.pub"

exit 0

もちろん、秘密キーを入力する必要があります(公開キーは参照用にのみスクリプトに含まれています。また、gitorious URLを入力する必要があります。

受信後フックに、以下を配置する必要があります。

path/to/Push-gitorious.sh run

実行オプションは重要です。それ以外の場合は、sshを直接実行します。

警告:リモートホストIDのチェックは行われません。 sshコマンドラインからオプションを削除し、必要に応じてknown_hostsをカスタマイズできます。このユースケースでは、それは重要ではないと思います。

37
Mildred

私が知っている2つの方法は、gitコマンドラインでgitサイトに使用する任意のキーファイルを指定できるようにするためです。このキーファイルを構成ファイルまたはスクリプトにハードコーディングする必要はありません。これをgitコマンドラインで直接指定するだけです。

方法1:GIT_SSH環境変数を使用する

コマンドラインでの使用法は次のようになります。

$ PKEY=~/.ssh/keyfile.pem git clone [email protected]:me/repo.git

このコマンドを使用するには、事前設定が必要です。まず、次の内容のシェルスクリプトを作成します。

#!/bin/sh
if [ -z "$PKEY" ]; then
    # if PKEY is not specified, run ssh using default keyfile
    ssh "$@"
else
    ssh -i "$PKEY" "$@"
fi

次に、GIT_SSH変数をエクスポートして、上記のシェルスクリプトの場所と同じ値に設定します。

$ export GIT_SSH=~/ssh-git.sh

ここで、〜/ ssh-git.shは上記のシェルスクリプトのファイル名です。

スクリプトは実行可能である必要があるため、chmodを実行します。

$ chmod +x ~/ssh-git.sh

これで、使用することを選択した任意のキーファイルでこのコマンドを実行できます。

$ PKEY=~/.ssh/keyfile1.pem git clone [email protected]:me/repo.git

別のホストに別のキーファイルを使用するには:

$ PKEY=~/.ssh/keyfile2.pem git clone [email protected]:other/repo.git

これは、使用する任意のキーファイルをサポートします。使用したいキーファイルでgitを実行する必要があるたびに、PKEY変数にそれを指定します。 GIT_SSHが事前に構成されている限り、他のすべてを忘れることができます。

PKEY変数に注意してください。 GIT_SSHが指しているシェルスクリプトで使用されている名前と一致する限り、任意の名前を使用できます。

方法2:ラッパースクリプトを使用する

ラッパースクリプトの使用方法は次のようになります。

$ git.sh -i ~/.ssh/keyfile.pem clone [email protected]:me/repo.git

-iオプションを指定してsshを実行するように見えるため、この使用法は直感的です。

これには、シェルスクリプトとGIT_SSHの事前設定は必要ありません。 gitコマンドでこの単一のラッパースクリプトをダウンロードして実行するだけです。

このラッパースクリプトのコピーは、ここから入手できます。 http://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git -command /

28
alvinabad

外部スクリプトを使用しない簡単な代替手段は、SSHエイリアスを使用することです。元のポスターが〜/ .ssh/configを変更しないように特別に要求したことは知っていますが、ここには誤解があると思います。

サーバー上のローカルユーザーは、コミットを実行しているユーザーとは異なり、「git Push」を実行しているユーザーとは異なるユーザーである可能性があります。

  • サーバー上で、ホスティングソフトウェアはシングルユーザーとして実行できます(通常は「git」)
  • コミットを行う人の身元はgitのビジネスのみ(コミットのメタデータに追加するため)であり、サーバーとは無関係であり、サーバーでの認証の対象ではありません
  • 'git Push'-erのIDは関連しており、sshキーに基づいてサーバー上でgitホスティングソフトウェアを実行しているシステムで確立されます

このため、プッシュを実行するシステムでは、以下で説明する方法に従ってsshエイリアスを使用することにより、同じgitリポジトリ内であっても、同じローカルアカウントと同じリモートサーバーに対しても特定のIDを強制できます。

Gitorious.orgサーバーに通常のアカウントがあると仮定して、「開発者」と呼びましょう。 「開発者」アカウント[1]を使用して自動的にプッシュしたくないので、同期のために別の巨大なアカウントを作成します。ロボット'。

自動化には、「ロボット」アカウントのみが使用されます。

ステップ1:プッシュする必要があるgitoriusプロジェクトに「ロボット」を追加します。

ステップ2:ローカルマシンでパスワードなしのキーを作成します(これは、gitoriousのロボットアカウントに関連付けられます)。

ssh-keygen -f ~/.ssh/id_rsa_robot

ステップ:公開鍵〜/ .ssh/id_rsa_robot.pubを、「ロボット」アカウントのgitoriousにアップロードします。

ステップ4:gitoriousのgit SSH URIの形式はgit @ gitorious.org :: prj_or_user/subproject.git。 〜/ .ssh/configファイルに次の行を追加します。

Host robot.gitorious.org
        HostName gitorious.org
        IdentityFile ~/.ssh/id_rsa_robot
        IdentitiesOnly "yes"

これにより、次のことが確認されます。

  • 'robot.gitorious.org'ホスト名を使用する場合は常にgitorious.org(HostNameオプション)に接続します。
  • パスワードなしのキーを使用してgitorius.orgでロボットとして認証します(IdentiFileオプション)。
  • sshエージェントを実行している場合でも、デフォルトキーは無視され、パスワードのないものが使用されます(IdentiesOnly "yes")。

ステップ5:プロジェクトのgitoriousのSSH URIが「[email protected]:project/project.git」であると想定し、ローカルリポジトリで、ホストを少し変更した新しいリモート「autopush」を定義します名前:

git remote add autopush [email protected]:project/project.git

セットアップが完了したら、「autopush」リモート経由でgitoriousにプッシュしてみてください。

git Push autopush master

すべてがうまくいき、Pushに変更がある場合は、「ロボット」として「gitorious.org」に正常にプッシュされていることがわかります。

[1]自動プッシュの場合、アカウントのパスワードなしのキーを生成する必要がありますが、それを巨大な「開発者」アカウントに添付すると、自動ジョブは任意の巨大なプロジェクトにプッシュできます「開発者」はgi敬の念に関与しています。

3
user4110936