В чем причина незакрепленных предметов? Могут ли они быть безопасно удалены "git prune"? - PullRequest
0 голосов
/ 30 августа 2018

Я использую локальное Git-репо, которое использует SVN-репозиторий нашей компании в качестве источника.

Я часто получаю сообщение:

ошибка: последний прогон gc сообщил следующее. Пожалуйста, исправьте основную причину и удалите .git / gc.log. Автоматическая очистка не будет выполняться до тех пор, пока файл не будет удален.

предупреждение: слишком много недоступных незакрепленных предметов; запустите 'git prune', чтобы удалить их.

Действительно удаление .git/gc.loc и вызов git prune решает проблему.
Однако в комментарии к VonC answer to Как пропустить всплывающее окно «Loose Object» при запуске «git gui» от Michael Donohue , Майкл Донохью заявляет:

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

В ответе (также VonC ) на Вся команда получает «слишком много недоступных незакрепленных объектов» - вопрос по проблема с незакрепленными объектами после перехода из SVN в git - jlengrand , VonC пишет:

  • побежал git prune и молился, чтобы это не сломало вещи (что, к счастью, не сломало)

Итак, я полагаю, git prune - опасная операция, которая может разрушать вещи.

Чтобы безопасно справиться с сообщением «слишком много недоступных незакрепленных предметов», у меня есть следующие вопросы:

Что вызывает эти незакрепленные объекты (см. man git-fsck о недостижимом объекте и см. torek ' ответ - о внутренней работе git-объектов и хэшей и git gc, git prune и git repack - до Что делает Git, когда мы делаем: git gc - git prune by Lyes CHIOUKH )?
Только git svn push, что:

  1. читает объект коммита git,
  2. отправляет его на сервер SVN,
  3. извлекает сохраненную версию SVN,
  4. создает новый объект git commit, который отражает ревизию SVN,
  5. заменяет указатель HEAD на коммит из шага 1 указателем на коммит шага 4, а
  6. оставляет исходный коммит как свободный объект.

Действительно ли это вызывает свободные коммиты?
Это вызывает все свободные коммиты (я также делаю некоторые манипуляции с деревом мерзавцев, которых еще нет в SVN, такие как git stash, git cherry-pick, git rebase и git reset)?

Когда мне понадобятся эти незакрепленные предметы? Что такое хорошая политика для использования git prune в моем личном репозитории git?

1 Ответ

0 голосов
/ 30 августа 2018

В Git все новые объекты начинаются как "свободные" объекты. (Мне совершенно не понятно, почему вы получаете ошибку слишком много .)

Существует сантехническая команда git hash-object, которая может создать новый объект любого типа. Другие команды в основном встроены в git hash-object для нужного им типа (ов) объектов, например, git write-tree создает некоторое количество объектов дерева, используя индекс, а git commit-tree создает один объект фиксации. Использование git add создает свободный объект для каждого добавленного файла; очевидно, в некоторых случаях это может быть много объектов.

Поэтому довольно легко создать большое количество незакрепленных объектов, но, как правило, команды Git, которые делают , также запускают git gc --auto до pack автоматически. Как только они благополучно упакованы, git prune удаляет незакрепленные:

Итак, я полагаю, git prune - опасная операция, которая может разрушать вещи.

Это не особенно опасно, если вы запускаете его, ничего не делая (т.е. не запускаете команды Git, которая может активно создавать свободные объекты). Добавление --expire 14.days.ago позволяет сохранить недавно созданные незакрепленные объекты, и это то, что делает git gc - ну, он использует вашу настройку gc.pruneExpire, но по умолчанию 14.days.ago.

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

...