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に指示するコマンドラインオプションまたは環境変数が必要です。それをしてもいいですか?
また、ミラーリングを実現する方法は他にもありますか?そして、それを他の方法で設定することは可能ですか?
答えは 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
をカスタマイズできます。このユースケースでは、それは重要ではないと思います。
私が知っている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 /
外部スクリプトを使用しない簡単な代替手段は、SSHエイリアスを使用することです。元のポスターが〜/ .ssh/configを変更しないように特別に要求したことは知っていますが、ここには誤解があると思います。
サーバー上のローカルユーザーは、コミットを実行しているユーザーとは異なり、「git Push」を実行しているユーザーとは異なるユーザーである可能性があります。
このため、プッシュを実行するシステムでは、以下で説明する方法に従って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"
これにより、次のことが確認されます。
ステップ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敬の念に関与しています。