3行まとめ
-
git pushで 141 エラーが出るのは、リモート側(GitHub など)のタイムアウトが原因 - タイムアウトが発生するのは一度にプッシュする量が多すぎるから
- 一度にプッシュする量を少なくするためにログを分割してプッシュした
- この記事は「1コミットが大きすぎる」や「1ファイルが大きすぎる」への対応ではないです
状況
1年間開発を続けていた git リポジトリがある。git-lfs を利用している。
とある事情でリモートリポジトリを引っ越ししたい。
GitHub で新規のリモートリポジトリを作成して、最新のメインブランチをプッシュしたところ git push がタイムアウトし、エラーコード141 が発生した。
解決した方法を記載します。
原因: タイムアウトによるエラー
この問題は一度に転送するデータ量(特に大きな LFS オブジェクト)が多すぎる際に起こりやすいようです。
今回は、大きなリポジトリを新しい場所へ引っ越しでログがたくさんあるメインブランチをプッシュしようとしたため発生したようです。
解決策: 小分けにしてプッシュする
この問題を解決するためにメインブランチでのプッシュではなく、メインブランチのログにあるコミットを月ごとの小分けにしてプッシュする方法で対応し、解決しました。
具体的な手順
以下の手順でこの作業を進めました。
- メインブランチのログからマージコミットを探し、ハッシュ値・日付を控える
- 指定のハッシュ値でブランチを作成する
- ブランチをプッシュする
- 2〜3を繰り返す
- メインブランチをプッシュする
- 不要なブランチを削除する
参考スクリプト1: push.sh
指定のコミットハッシュをプッシュするスクリプト
#!/bin/bash -xe
SCRIPT_DIR=$(cd $(dirname $0); pwd)
cd $SCRIPT_DIR
# 引数1: コミットハッシュ
# 引数2: 日付
COMMIT_HASH=$1
DATE=$2
if [ -z "$COMMIT_HASH" ]; then
echo "Usage: $0 <commit-hash> <date>"
exit 1
fi
if [ -z "$DATE" ]; then
echo "Usage: $0 <commit-hash> <date>"
exit 1
fi
BRANCH_NAME="feature/update_$DATE"
git checkout -b $BRANCH_NAME $COMMIT_HASH
git push
参考スクリプト2: push-exec.sh
控えたハッシュ値、日付で連続実行するスクリプト
#!/bin/bash -xe
SCRIPT_DIR=$(cd $(dirname $0); pwd)
cd $SCRIPT_DIR
./push.sh abcd1234 2025-01-30
./push.sh abcd1234 2025-02-20
./push.sh abcd1234 2025-03-30
./push.sh abcd1234 2025-04-30
./push.sh abcd1234 2025-05-30
./push.sh abcd1234 2025-06-30
./push.sh abcd1234 2025-07-30