Как установить максимальное количество коммитов на git push

Я нахожусь в процессе миграции существующего репозитория SVN (только транк) с более чем 10000 коммитами в размещенное решение Git (в моем случае BitBucket).

Преобразование репозитория 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://__removed__@bitbucket.org/__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 коммитов, которых еще нет на сервере?

Я не хочу указывать каждый коммит для нажатия (как в этом вопросе ответ). Я просто хочу установить максимальный счет.

1 ответ

Я описал ручной способ сделать это в своем ответе "Ошибка Git: сбой RPC; результат =22, код HTTP = 404". (Этот ответ также описывает, что делать, если вы застряли на одном большом коммите.)

Как я упоминал в этом ответе и в комментариях, я рекомендую переключиться с HTTPS на SSH, если вы можете, потому что у меня не было такой проблемы с проталкиванием по SSH; кажется, ограничивается HTTPS.

Однако, если вы застряли на HTTPS, вам придется выдвигать меньшее количество коммитов за раз. Как и было задано в вашем вопросе, вот способ автоматизировать процесс (в виде сценария bash, который я создал вместе):

#!/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
Другие вопросы по тегам