Как уменьшить размер магазина Mercurial hg. Размер хранилища Hg превышает 5 ГБ, и сервер получает тайм-аут перед клонированием

Случайно я зарегистрировал около 5 ГБ файлов в Mercurial. Наш сервер сборки начал давать сбой во время клонирования репо. Таким образом, мы восстановили зарегистрированные файлы с помощью команды «Удалить». Но .hg/store/data по-прежнему содержит эти файлы. И его размер превышает 5 ГБ. Мы искали в Интернете и нашли несколько методов, например: hg convert. Но hg convert создает новое репо, что в нашем случае нежелательно. Также мы не можем продлить период ожидания нашего сервера сборки.

Как мы можем полностью удалить ошибочную регистрацию, не сохраняя ее в .hg/store/data? Или Как мы можем уменьшить размер .hg/store/data?


person Sumit Sood    schedule 29.08.2016    source источник
comment
Как размещается репозиторий? Где твой сервер? Используете ли вы битбакет или какое-то облачное решение или размещаете его самостоятельно?   -  person Lasse V. Karlsen    schedule 29.08.2016
comment
Привет Лассе. Мы используем Bitbucket для размещения нашего репозитория   -  person Sumit Sood    schedule 29.08.2016
comment
Тогда вам нужно удалить эти наборы изменений. В настройках это можно сделать. Обратите внимание, что каждый клон, который уже содержит неверный набор изменений, необходимо удалить и повторно клонировать. В зависимости от вашего сервера сборки его также может потребоваться обновить, если он хранит кеш наборов изменений, готовых к вступлению. Также обратите внимание, что любые наборы изменений, следующие за ошибочной фиксацией, будут удалены, поэтому вам нужно привить эти на ветку в локальном клоне и очистить. Я могу опубликовать лучший ответ сегодня вечером, но, к сожалению, не сейчас.   -  person Lasse V. Karlsen    schedule 29.08.2016
comment
stackoverflow .com/questions/28735889/ и stackoverflow.com/questions/9627964/ объясните, как удалить наборы изменений из репозитория Bitbucket mercurial   -  person Leon    schedule 29.08.2016


Ответы (2)


Вот что вам нужно сделать: вам нужно удалить эти наборы изменений.

Поскольку ваш репозиторий размещен на Bitbucket, у вас нет прямого доступа к файлам, поэтому вам нужно использовать то, что предоставляет веб-сайт.

В вашем проекте репозитория в настройках есть раздел для удаления наборов изменений.

Обратите внимание, что это также удалит все наборы изменений, которые были зафиксированы поверх плохого набора изменений. Мы займемся этим.

Я подчеркну это:

  1. Сделать
  2. Конечно
  3. Вы
  4. Есть
  5. Резервные копии!

Вот шаги

Важно: если у какого-либо разработчика в вашей команде есть какие-либо ожидающие решения локально, например, наборы изменений, которые еще не были отправлены в битбакет, но они скопировали неверный набор изменений из битбакета, вам нужно чтобы сделать больше прививки, убедитесь, что вы понимаете все, что нужно сделать, прежде чем пытаться это сделать.

  1. Убедитесь, что у вас есть хорошая резервная копия и локальный клон вашего репозитория, это имеет первостепенное значение. Я (или Stack Overflow) не несу ответственности, если вы в конечном итоге потеряете наборы изменений, которые хотите оставайтесь в этом процессе. Обратите особое внимание на предупреждение выше о невыполненных наборах изменений, которые могут быть у других разработчиков.
  2. В локальном клоне сначала привяжите все наборы изменений, которые были зафиксированы поверх плохого набора изменений, к набору изменений, непосредственно предшествующему ему.

    т.е. если история выглядит так:

    1---2---3---BAD---5---6---7
    

    Вы хотите привить 5-7 поверх 3, чтобы потом у вас была такая история:

    1---2---3---BAD---5---6---7
             \
              +--5---6---7
    
  3. Затем удалите плохой набор изменений (и все, что за ним следует) с помощью этой команды:

    hg strip BAD
    
    `BAD` here is the number or hash of the bad changeset
    
  4. Убедитесь, что локально все выглядит хорошо, а затем перейдите на bitbucket.org.
  5. Найдите свой репозиторий, зайдите в Настройки и найдите раздел Strip Changesets.
  6. Введите хэш неправильного набора изменений и попросите Bitbucket удалить его.
  7. После этого нажмите из своего локального клона, чтобы вернуть наборы изменений, которые вы привили, обратно в битбакет.
  8. Важно: теперь вам нужно заставить всех, кто уже клонировал из bitbucket и получил плохой набор изменений, отказаться от своего локального клона и повторно клонировать. Это приведет к созданию новой копии репозитория без плохого набора изменений.
person Lasse V. Karlsen    schedule 29.08.2016
comment
Привет Лассе. Спасибо за предоставление того, что требуется. Я хотел бы знать, как привить новый набор изменений после плохого набора изменений. Как вы сказали, вы хотите привить 5-7 поверх 3, чтобы впоследствии у вас была эта история:. Пожалуйста, предоставьте команду hg для того же. - person Sumit Sood; 29.08.2016
comment
Вы не можете, вы должны привить их раньше, потому что команда strip удалит их. Если вы это сделаете, то будет слишком поздно. - person Lasse V. Karlsen; 29.08.2016
comment
Я хотел бы знать, как привить новый набор изменений после плохого набора изменений. Как вы сказали, вы хотите привить 5-7 поверх 3, чтобы впоследствии у вас была эта история:. Пожалуйста, предоставьте команду hg для того же. - person Sumit Sood; 29.08.2016
comment
Я бы порекомендовал вам использовать визуальный инструмент, но с помощью командной строки вы сначала обновите набор изменений до плохого, а затем выполните команду такого типа: `hg graft -r 20:30', где 20 и 30 - номера ревизий. или хэши первого и последнего хорошего набора изменений, следующего за плохим. Вы не хотите включать набор изменений, в котором вы пытались удалить файлы. - person Lasse V. Karlsen; 29.08.2016
comment
Спасибо за ответ :) - person Sumit Sood; 29.08.2016

Параметр -r параметра hg clone позволяет создать репозиторий без наборов изменений после определенной ревизии.

Таким образом, вы можете сделать следующее (при условии, что LAST_GOOD_CHANGESET — это набор изменений непосредственно перед вашей неправильной фиксацией):

hg clone -r LAST_GOOD_CHANGESET repo repo.1
mv repo repo.bak
mv repo.1 repo

Обратите внимание, однако, что это приведет к удалению всех коммитов после вашего неправильного коммита, поэтому вам придется переиграть важные (то есть исключая те, которые были сделаны в попытках исправить ошибку).

Кроме того, если у вас есть ветки, вы должны указать их как дополнительные -r аргументы к hg clone, иначе они тоже будут удалены из очищенного репозитория.

person Leon    schedule 29.08.2016
comment
Привет Леон. Наш сервер сборки автоматически клонирует репозиторий и не находится под нашим контролем. Мы просто хотим удалить эти плохие файлы из .hg/store/data. - person Sumit Sood; 29.08.2016
comment
@SumitSood Находится ли исходный репозиторий (из которого клонируется сервер сборки) под ваш контроль? Я имел в виду, что вы выполняете предложенные операции над своим исходным репозиторием. - person Leon; 29.08.2016