61

私はGitを初めて使用し、Githubのリモートリポジトリ(リポジトリB)にプッシュしたいかなり大きなプロジェクトがあります。元のプロジェクトもGithubにありましたが、別のリポジトリ(リポジトリA)からのものでした。Repo Bでプロジェクトをセットアップする前に、Repo Aのファイルにいくつかの変更を加える必要があります。リモート、sshキーなどをセットアップしましたが、コードベースをRepoBにプッシュすると問題が発生します。

いつも次のエラーが発生します。

$ git push <remote_repo_name> master
Enter passphrase for key '/c/ssh/.ssh/id_rsa':
Counting objects: 146106, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (35519/35519), done.
fatal: pack exceeds maximum allowed size00 GiB | 154 KiB/s
fatal: sha1 file '<stdout>' write error: Invalid arguments
error: failed to push some refs to 'git@github.com:<repo>.git

ローカルのgitconfigで次の設定を変更しました

git config pack.packSizeLimit 1g
git config pack.windowMemory 1g

...そしてgitgcを実行しました(各パックが1GBのパックサイズ内にとどまるようにパックを再編成しました)。これは機能せず、上記のエラーが発生します。

各パックのサイズも小さくしてみました…。

git config pack.packSizeLimit 500m
git config pack.windowMemory 500m

...そしてgitgcを実行しました(各パックが500MBのパックサイズ内にとどまるようにパックを再編成しました)。これも機能せず、同じエラーが発生しました。

Githubのデフォルトのパックサイズ制限(ある場合)がわかりません。それが重要な場合、アカウントはマイクロアカウントです。

4

3 に答える 3

47

packsize の制限は、git プロトコル コマンド (プッシュ) には影響しません。

以下 の git-configからpack.packSizeLimit:

パックの最大サイズ。この設定は、再パック時のファイルへのパックにのみ影響します。つまり、git:// プロトコルは影響を受けません

プッシュ git を実行すると、サイズに関係なく常に 1 つのパックが作成されます。

これを修正するには、2 つ (またはそれ以上) のプッシュを使用します。

git push remoteB <some previous commit on master>:master
...
git push remoteB <some previous commit after the last one>:master
git push remoteB master

これらのプッシュはすべて小さいパックになり、成功します。

于 2013-07-24T06:35:08.330 に答える
38

onionjake が彼の回答で指摘したように、pack.packSizeLimit設定は push には影響しません。彼が示唆したように、これは多くの場合、それぞれのコミットが少ない複数のプッシュを使用することで対処できます。rurban は、500 コミ​​ットのチャンクを自動的にプッシュする方法についてコメントを投稿しました。以下は彼のコメントの修正版で、リモートのブランチが存在しないか存在し、すでにいくつかのコミットが含まれているかに関係なく、正しく機能するように一般化されています。また、リポジトリに複数のルート コミットが含まれている場合のエラーを防ぐために、呼び出しに--first-parent引数を追加しました。また、効率を改善するためにいくつかの調整を行い、コミットの最終 (部分) バッチをプッシュするためgit logの追加の呼び出しを追加しました。git push

# Adjust the following variables as necessary
REMOTE=origin
BRANCH=$(git rev-parse --abbrev-ref HEAD)
BATCH_SIZE=500

# check if the branch exists on the remote
if git show-ref --quiet --verify refs/remotes/$REMOTE/$BRANCH; then
    # if so, only push the commits that are not on the remote already
    range=$REMOTE/$BRANCH..HEAD
else
    # else push all the commits
    range=HEAD
fi
# count the number of commits to push
n=$(git log --first-parent --format=format:x $range | wc -l)

# push each batch
for i in $(seq $n -$BATCH_SIZE 1); do
    # get the hash of the commit to push
    h=$(git log --first-parent --reverse --format=format:%H --skip $i -n1)
    echo "Pushing $h..."
    git push $REMOTE ${h}:refs/heads/$BRANCH
done
# push the final partial batch
git push $REMOTE HEAD:refs/heads/$BRANCH
于 2018-07-22T19:03:54.987 に答える