長すぎます。
このコマンドはgit fetch origin [branch-name]
スクリプト内で呼び出すと効果はありませんが、シェルから呼び出すと機能します。
スクリプトと端末は別のボックスでうまく動作します。ボックスは企業代理人の後ろにあります。
シェルとスクリプトの環境には若干の違いがあると思います。
質問
このコマンドをスクリプトで実行するにはどうすればよいですか?
詳細
背景ストーリー
リポジトリをGitHubに移行する前は、両方のシステムですべてがうまく機能しました。両方のシステムのソースがそれに応じて更新されました。開発システムはすぐに実行を開始しますが、ステージングシステムはそうではありません。
スクリプト
スクリプトの部分は次のとおりです。実際に始める前に、すべてのリポジトリに到達したことを確認するので、ここで停止します。
check_git_connection_mapbender() {
cd ${installation_folder}mapbender
git fetch origin ${git_mapbender_repositoryBranch} &>/dev/null
if [ $? -ne 0 ]; then
echo "Fetching Mapbender repository failed!"
echo "Abording update..."
exit 1
fi
set_git_filemode_config
}
これらのecho
2行はエコーされ、スクリプトは終了します。変数がすべて設定されました。
私が試したこと
シェル比較
環境変数に問題があると疑われ、git fetch origin [branch-name]
失敗したコマンドを端末から直接呼び出してみました。シェルから呼び出すと、このコマンドはすべての場合に機能します。
me@box:/path/to/repo$ git fetch origin [branch-name]
me@box:/path/to/repo$ sudo git fetch origin [branch-name]
me@box:$ sudo -i cd /path/to/repo && git fetch origin [branch-name]
me@box:$ sudo su -
->root@box: cd /path/to/repo && git fetch origin [branch-name]
うまくいかないのは次のとおりです。
me@box:$ sudo -i
->root@box: cd /path/to/repo && git fetch origin [branch-name]
<--実際にはスクリプトのようなエラーが発生します。
子の設定
最初は、両方のシステムの効果的なgit設定が同じであることを確認しました。
それ以来、私は成功せずに問題を解決するためにステージングシステムにいくつかのオプションを追加してみました。
私は以下を設定しようとしています:
url.http://.insteadof=https://
http.https://github.com.sslverify=false
http.proxy
https.proxy
http.sslCert
役に立たなかったのでもう一度削除しました。
デバッグ接続
export GIT_TRACE_CURL=true
スクリプトに次のように追加しました。
check_git_connection_mapbender() {
cd ${installation_folder}mapbender
# DEBUG
export GIT_TRACE_CURL=true
source /etc/environment
echo $http_proxy
echo $https_proxy
# END DEBUG
echo $git_mapbender_repositoryBranch
git fetch origin ${git_mapbender_repositoryBranch} # &>/dev/null
if [ $? -ne 0 ]; then
echo "Fetching Mapbender repository failed!"
echo "Abording update..."
exit 1
fi
set_git_filemode_config
}
...出力は
[correct http_proxy environment variable]
[correct https_proxy environment variable]
[correct branch name]
16:52:17.600248 http.c:599 == Info: Couldn't find host github.com in the .netrc file; using defaults
16:52:17.603973 http.c:599 == Info: Trying 140.82.121.4...
16:52:17.604035 http.c:599 == Info: TCP_NODELAY set
16:52:17.605297 http.c:599 == Info: connect to 140.82.121.4 port 443 failed: Verbindungsaufbau abgelehnt
16:52:17.605372 http.c:599 == Info: Failed to connect to github.com port 443: Verbindungsaufbau abgelehnt
16:52:17.605386 http.c:599 == Info: Closing connection 0
fatal: unable to access 'https://github.com/LVGL-SL/mapbender-sl.git/': Failed to connect to github.com port 443: Verbindungsaufbau abgelehnt
Fetching Mapbender repository failed!
Abording update...
エージェントの設定
システムは、サブネットと同じファイアウォールルールセットに準拠する必要があると言われました。
答え1
ボックスは企業代理人の後ろにあります。
デフォルトを使用する.netrcファイルにホストgithub.comが見つかりません
140.82.121.4ポート443への接続に失敗しました:Verbindungsaufbau abgelehnt
スクリプトはsudoで実行され失敗しますが、git fetch Origin [branch-name]コマンドは端末で実行されます。
推測:あなたの会社エージェントはあなたのユーザーアカウント(おそらくファイル)の下のどこかに保存されている資格情報を要求します.netrc
。
通常のユーザーとしてgitコマンドを実行すると、これらの資格情報にアクセスできます。
スクリプトをrootとして実行すると、rootのホームディレクトリで資格情報が見つかりますが、見つからないため失敗します。
sudo
ターミナルでgitコマンドを実行してこれを確認できます。上記の場合でも失敗します。
問題を解決するには、githubにアクセスするために一般ユーザーの資格情報を必要とするスクリプトをrootとして実行する理由を説明する必要があります(まず、解決する必要がある基本的な設計問題のように聞こえます)。説明によると、エージェントにルート資格情報を提供する(賢明ではない)、スクリプトで特定のユーザーを偽装してgitコマンドを実行する、またはこれが最良のバリエーションです。ルートアクセスを必要としないように、ルートアクセスを必要とするすべてのエントリを変更できます。一般ユーザーとして実行できます。