2016-10-06 8 views
0

私の場合BitBucketでは、ホストされているGitソリューションに10000を超えるコミットを持つ既存のSVNリポジトリ(トランクのみ)を移行しています。git pushで最大コミット数を設定するには

SVNリポジトリをローカルのGitに変換することは問題ありませんでしたが、今ではすべてのリビジョンを空のGitリポジトリオンラインにプッシュしたいと思います。

しかし、TortoiseGitからのプッシュをやって、それがこの出力を停止します。

git.exe push -v --progress "origin" master 

Counting objects: 198817, done. 
Delta compression using up to 4 threads. 
Compressing objects: 100% (83858/83858), done. 
POST git-receive-pack (chunked) 
Writing objects: 100% (198817/198817), 1.54 GiB | 460.00 KiB/s, done. 
Total 198817 (delta 130510), reused 178506 (delta 112822) 
fatal: The remote end hung up unexpectedly 
fatal: The remote end hung up unexpectedly 
error: RPC failed; curl 52 Empty reply from server 
Pushing to https://[email protected]/__removed__/__removed__.git 
Everything up-to-date 


git did not exit cleanly (exit code 1) (3644609 ms @ 06.10.2016 11:16:23) 

私は私の問題の唯一の解決策は一度に1000回のコミットをプッシュすることだと思います。しかし、サーバー上にまだ存在しない最初の1000個のコミットにはどのようにして制限できますか?

プッシュする各コミットを指定したくありません(this question answeredのように)。私は単に最大数を設定するだけです。

+0

_ _「私は私の問題の唯一の解決策は一度に1000回のコミットをプッシュすることだと思う」:

完全を期すため、ここで一度にコミットの特定の番号をプッシュするスクリプトがありますあなたはそう思いますか? – 1615903

+0

私のプッシュは大きすぎると思います。私はそれをより小さな部分でバッファリングしようとします。 –

+2

私はそれが問題なのかどうかは分かりませんが、テストするのは簡単です。マスターのコミットの長いセットの近くでコミットを選択し、手動でプッシュします(もちろん、祖先がコミットする)、 'git push :master'。いくつかの迷惑なGUI(迷惑なコマンドライン対:-)からそれを行う方法、私は分かりません。 – torek

答えて

0

my answer to "Git error: RPC failed; result=22, HTTP code = 404"でこれを手動で説明しました。 (その答えは、大きなコミットをしてしまった場合の対処方法についても説明しています)。

私がその回答とコメントで述べたように、できる限りHTTPSからSSHに切り替えることをお勧めします。この種の問題はSSHを使用して推進しています。それはHTTPSに限られているようです。

しかし、HTTPSに慣れている場合は、一度にコミットのサブセットを小さくする必要があります。あなたの質問で要求されるように、ここでは(私は一緒に投げたスクリプトの形で)プロセスを自動化する方法です:私はこれをテストするために便利なレポ/サーバーを持っていない

#!/bin/bash 
# Bisect a git push to get around HTTP POST size limits. 

branch=$1 
commits=$(git log --oneline | wc -l) 
current=$commits 

while [ $(git rev-parse origin/$branch 2>/dev/null) != $(git rev-parse $branch) ] 
do 
    # Git push command counts backwards, so invert the counter. 
    inverse=$(expr $commits - $current) 
    git push origin $branch~$inverse:$branch 

    if [ $? -ne 0 ] 
    then 
    # If failed, bisect further, if possible. 
    if [ $current > 1] 
    then 
     current=$(expr $current/2) 
    else 
     echo "Error, could not push single commit." 
     exit 1 
    fi 
    else 
    # If successful, reset bisect. 
    current=$commits 
    fi 
done 

は、しかし、それは少なくともあなたを始める必要があります。

これは、コミットを特定の数に制限するのではなく、一度に正常にプッシュできるコミット数を把握するためにバイナリ検索を実行することに注意してください。 - なぜ

#!/bin/bash 
# Push commits in smaller batches. 

branch=$1 
atonce=$2 
commits=$(git log --oneline | wc -l) 
current=$atonce 

while [ $(git rev-parse origin/$branch 2>/dev/null) != $(git rev-parse $branch) ] 
do 
    # Git push command counts backwards, so invert the counter. 
    inverse=$(expr $commits - $current) 
    git push origin $branch~$inverse:$branch 

    if [ $? -ne 0 ] 
    then 
    echo "Error, could not push $atonce commits." 
    exit 1 
    else 
    current=$(expr $commits + $atonce) 
    fi 
done 
関連する問題