`onyxia-init.sh`: automatic clone of private GitHub repos fails (`could not read Username`) — token-only URL credentials dropped by git 2.55
メンテナーはふだん 3 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 78/100
調査の方向性
base/scripts/onyxia-init.sh の CLONE_URL の構築箇所を読み、提案された diff にある GitHub、Bitbucket、GitLab の認証情報形式を比較してください。指定されたイメージ内で、提供された git ls-remote のループを使い、プライベートリポジトリと有効なトークンで再現してください。トレースに含まれる認証情報はすべて伏せてください。修正された URL 形式で自動クローンが正常に認証されれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Summary
With git.token and git.repository set, the automatic clone of a private GitHub repository fails at startup:
Cloning into 'MarBLE'...
warning: redirecting to https://github.com/<owner>/<repo>.git/
fatal: could not read Username for 'https://github.com': No such device or address
The service then starts on a workspace folder that does not exist (code-server ... /home/onyxia/work/<repo>) and the user gets an empty VSCode.
The token is valid and has the repo scope. GitHub accepts it, but git sends the follow-up request without credentials (see the trace below).
Environment
- Image:
inseefrlab/onyxia-vscode-python:py3.13.15
(sha256:e343e00be96d9c9b70abd7bd06eb2b90429e03e6b968a0e10a49d356f2fd8b6c) - Ubuntu 24.04.5 LTS
- git
1:2.55.0-0ppa1~ubuntu24.04.2(git-core PPA) git-remote-httpslinked againstlibcurl-gnutls.so.4(libcurl 8.5.0-2ubuntu10.16)- Service values:
git: enabled: true token: <classic PAT, scope repo> repository: https://github.com/<owner>/<private-repo>.git branch: main asCodeServerRoot: true
This used to work. The failure started with a recent image (our /opt/onyxia-init.sh is dated 2026-10-19).
Root cause
For GitHub, base/scripts/onyxia-init.sh (l. 100) puts the token alone in the userinfo, with no password:
CLONE_URL="$URL_PREFIX"/"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
# -> https:///<TOKEN>@github.com/<owner>/<repo>.git
With git 2.55, the authenticated GET info/refs succeeds. Git then reports a "redirect", although GitHub did not send any 3xx or Location header. It continues on the URL without userinfo, and the POST git-upload-pack goes out unauthenticated and gets a 401:
GET /<owner>/<repo>.git/info/refs?service=git-upload-pack -> 401 (challenge, expected)
GET /<owner>/<repo>.git/info/refs?service=git-upload-pack -> 200 (Basic auth with user '<TOKEN>')
warning: redirecting to https://github.com/<owner>/<repo>.git/
POST /<owner>/<repo>.git/git-upload-pack -> 401 (no Authorization header)
fatal: could not read Username for 'https://github.com': terminal prompts disabled
If the userinfo has a password part (user:password@), git keeps the credentials across this false redirect and the clone succeeds.
I have not checked whether the regression comes from git 2.55 itself or from git 2.55 combined with libcurl 8.5. Either way, <TOKEN>@ no longer works in the current image.
Reproduction
Requires a classic PAT with repo scope and any private repository it can read.
docker run --rm -e TOKEN=<PAT> -e REPO=<owner>/<private-repo> \
inseefrlab/onyxia-vscode-python:py3.13.15 bash -c '
export GIT_TERMINAL_PROMPT=0
for u in "$TOKEN" "$TOKEN:x-oauth-basic" "x-access-token:$TOKEN"; do
echo "== userinfo: ${u//$TOKEN/<TOKEN>}"
git ls-remote "https://[email protected]/$REPO.git" HEAD 2>&1 | sed "s/$TOKEN/<TOKEN>/g"
done'
Observed:
| userinfo | result |
|---|---|
<TOKEN>@ (format used by onyxia-init.sh) |
❌ could not read Username |
<TOKEN>:x-oauth-basic@ |
✅ |
x-access-token:<TOKEN>@ |
✅ |
The URL actually built by the script (https:///<TOKEN>@github.com/..., with three slashes) fails in the same way. I reproduced this on 3 different private repositories.
To get the HTTP trace above, add GIT_TRACE_CURL=1 GIT_TRACE_CURL_NO_DATA=1 to the failing command. Redact the Authorization lines before sharing.
Proposed fix
In base/scripts/onyxia-init.sh:
if [ "$REPO_DOMAIN" = "github.com" ]; then
- CLONE_URL="$URL_PREFIX"/"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
+ CLONE_URL="$URL_PREFIX"x-access-token:"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
elif echo "$GIT_REPOSITORY" | grep -qi "bitbucket"; then
- CLONE_URL="$URL_PREFIX"/x-token-auth:"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
+ CLONE_URL="$URL_PREFIX"x-token-auth:"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
else
# GitLab (gitlab.com or hosted instance)
- CLONE_URL="$URL_PREFIX"/oauth2:"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
+ CLONE_URL="$URL_PREFIX"oauth2:"$GIT_PERSONAL_ACCESS_TOKEN"@"$URL_NO_PREFIX"
fi
- GitHub:
x-access-token:<TOKEN>works with classic and fine-grained PATs. - All providers: this also removes the extra
/.$URL_PREFIXalready ends with//, so the script currently buildshttps:///....
Suggestion: when the clone fails, the init script could also stop or log a clear error instead of starting code-server on a folder that does not exist.
Workaround for users
In a terminal inside the service:
git clone https://x-access-token:[email protected]/<owner>/<repo>.git /home/onyxia/work/<repo>
Then reload the window. The same command can go in a custom init script, guarded by [ -d /home/onyxia/work/<repo> ] ||.
- 主要言語
- Shell
- スター
- 43
- フォーク
- 37
- 平均マージ
- 3日 17時間
- マージ済み PR(30日)
- 10
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
InseeFrLab/images-datascience のほかの issue
-
Git autoclone is broken if token is not defined対応中かも @olevitt が 7 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
InseeFrLab/images-datascience#433 ·
メンテナーはふだん 3 日以内に返信
-
難易度 3/5 1〜2日 初心者へのやさしさ 45/100
InseeFrLab/images-datascience#407 ·
メンテナーはふだん 3 日以内に返信
-
難易度 3/5 1〜2日 初心者へのやさしさ 45/100
InseeFrLab/images-datascience#298 · リアクション 1 件 ·
メンテナーはふだん 3 日以内に返信
-
migrate to aws config and credentials files再び着手できるかも @ihiverlet が 547 日前に担当しましたが、オープン中のプルリクエストはありません。 オープン
InseeFrLab/images-datascience#262 · コメント 2 件 · 担当者 1 名 ·
メンテナーはふだん 3 日以内に返信
-
Dependency Dashboardオープン
難易度 5/5 1週間以上 初心者へのやさしさ 10/100
InseeFrLab/images-datascience#14 ·
メンテナーはふだん 3 日以内に返信
InseeFrLab/images-datascience の issue をすべて見る
似ている issue
-
launch-client --save-creds creates creds/<account>/ with mode 755, not 700対応中かも @metis-sprock が今日担当しました。 オープンbacklog bug
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
EchoTools/nevr-runtime#1471 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
area/dev-infra area/reliability area/tests
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
agent-substrate/substrate#3461 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 78/100
pypa/advisory-database#412 ·
メンテナーはふだん 1 日以内に返信
-
documentation good first issue rust
難易度 1/5 1〜3時間 初心者へのやさしさ 78/100
elixpo/crumb.elixpo#257 ·
メンテナーはふだん 1 日以内に返信