Почему git запускает git gc --auto при каждом слиянии? - PullRequest
15 голосов
/ 12 сентября 2011

Сегодня git начал вести себя забавно (ну, смешнее, чем обычно), настаивая на запуске git gc после каждого слияния, даже если они идут спиной к спине.

C:\Projects\my-current-project>git pull
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 11), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From git.company.com:git/
   e992ce8..6376211  mybranch/next -> origin/mybranch/next
Merge made by recursive.
Auto packing the repository for optimum performance. You may also run "git gc" manually. See "git help gc" for more information.
FIND: Parameter format not correct
Counting objects: 252732, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (59791/59791), done.
Writing objects: 100% (252732/252732), done.
Total 252732 (delta 190251), reused 252678 (delta 190222)
Removing duplicate objects: 100% (256/256), done.
 .../stylesheets/style.css                          |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Это невероятно разрушительно, и я боюсь, что это означает, что мой репозиторий каким-то образом поврежден (это первый раз, когда я видел его автоматически gc). Мои опасения необоснованны? Если с моим репозиторием все в порядке, как мне остановить автоматическую упаковку?!

Ответы [ 4 ]

14 голосов
/ 12 сентября 2011

EDIT

Кажется, я заметил проблему.

Возможно, вы используете Cygwin / git или MsysGit в Windows. Я заметил, что из-за

FIND: Parameter format not correct

сообщение об ошибке. Проблема в том, что где-то ваши скрипты ловушек (или git внутренне ?!) вызывают find, который не находит утилиту поиска UNIX (GNU), а скорее находит FIND.EXE для Windows (MSDOS ... sic).

Вы должны быть в состоянии исправить общий путь вашей системы. Если это не вариант, явно укажите переменную окружения PATH внутри скрипта (или перед их вызовом)


Старый ответ для информации:

git gc --auto не всегда приводит к выполнению каких-либо действий; Вы уверены, что это занимает время каждый раз, или вы только что заметили, что это называется?

Если он вызывается каждый раз, вы можете

  • проверить права доступа к репозиторию (убедитесь, что он полностью доступен для записи!)
  • git fsck
  • git repack
  • git bundle --create mybundle.git --all и git clone mybundle.git, чтобы посмотреть, сможете ли вы каким-то образом «встряхнуть» преступника
  • посмотрите, можете ли вы перейти на более позднюю версию
  • если все остальное не сработало, исправьте или отладьте двоичный файл git-gc

По желанию, когда вы потрясли преступника, вы, возможно, сможете проанализировать, что отличается между вашим «очищенным» репо и текущим.

С Страница мануала git-gc :

С помощью этой опции git gc проверяет, требуется ли какая-либо служебная работа; если нет, он выходит без выполнения любая работа. Некоторые команды git запускают git gc --auto после выполнения операций, которые могут создать много свободных объекты.

Ведение домашнего хозяйства требуется, если в хранилище слишком много незакрепленных предметов или слишком много упаковок. Если число потерянных объектов превышает значение переменной конфигурации gc.auto, тогда все потерянные объекты объединяются в один пакет с помощью git repack -d -l. Установка значения gc.auto в 0 отключает автоматическая упаковка сыпучих предметов.

Если количество пакетов превышает значение gc.autopacklimit, то существующие пакеты (кроме отмеченных с файлом .keep) объединяются в один пакет с помощью опции -A в git repack. настройка gc.autopacklimit в 0 отключает автоматическое объединение пакетов.

8 голосов
/ 19 сентября 2015

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

Когда одно из моих репозиториев запускает «Автоматическая упаковка репозитория для оптимальной производительности» после каждого слияния,

git gc --prune=now

исправляет это. (Находясь на Mac, у меня нет проблемы FIND: Parameter format not correct.) Сейчас я использую git 2.4.1, но у меня это работало для нескольких версий 2. *.

Этот ответ на Как удалить не связанные ссылки из моего репозитория git предполагает, что может потребоваться очистить рефлог с помощью

git reflog expire --expire-unreachable=now --all

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

4 голосов
/ 12 сентября 2011

Какую версию git вы используете?Несмотря на это, я нахожу, что автоматический gc чрезвычайно разрушительный.

git config --global gc.auto 0

2 голосов
/ 05 февраля 2013

В вашем хранилище должно быть много объектов, которые начинаются с 17. Так что это вызывает git gc --auto. По умолчанию используется не менее 28 объектов с префиксом 17.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...