2014-12-20 3 views
3

У меня есть следующие GIT ветви: мастер и Dev:git: удалить мертвую ветку после переустановки?

*master* 
     | 
A--B--C 
    \--D--E 
     | 
     *dev* 

После перебазирования Дев на хозяина, у меня есть:

*master* 
     | 
A--B--C--D'--E' 
    \--D--E | 
      | 
      *dev* 

Так D и E остаются в 'мертвой ветви'. Как я могу их удалить?

+0

@CloseVoter: это не совсем по теме до дня мерзавец тега, с его 13600 последователей и около 50 000 вопросов, удаляется. – Kaz

ответ

5

Вам не нужно: потому что совершает D и E не имеет названия не указывая на них, они имеют право на «сборку мусора». В конце концов git запустит git gc и выбросит их для вас.

Если вы хотите ускорить это, вы можете запустить git gc самостоятельно, но затем вступает в действие сноска 1. :-)


Это не совсем верно. В то время как имя филиала dev теперь содержит идентификатор фиксации E' (копия), имеется две записи reflog, одна для dev и одна для HEAD, которые позволяют вам (и git) находить фиксацию E. Существует также полуспециальное имя, ORIG_HEAD, которое продолжается до тех пор, пока что-то еще не заменит его содержимое (например, другая перебаза или git merge).

По умолчанию большинство записей в журнале остаются в течение 30 дней или 90 дней в зависимости от того, доступна ли фиксация для текущей ветви ветви. Как только истечение срока действия файла reflog, , то объект является кандидатом на сбор мусора.

В качестве еще одной меры предосторожности, git gc оставляет только «незакрепленные объекты», если они не моложе двух недель (по умолчанию это настраивается, и есть опция , чтобы переопределить это также). Так что вообще, для номинально-заброшенного объекта, чтобы уйти, это:

  • должно быть не менее двух недель;
  • , возможно, срок действия каких-либо записей reflog (обычно 30 дней); и
  • не должно иметь альтернативных имен, поддерживающих его.

(И, конечно же, git gc должен работать, хотя мерзавец автоматически запускает это всякий раз, когда он «выглядит многообещающим».)

+0

Итак, D и E должны исчезнуть, если я запустил gc через месяц. Через месяц я вернусь, чтобы вы знали. Между тем, я буду смотреть, если это может произойти быстрее. –

+1

Вы можете * заставлять * его (сразу): (1) удалять любые записи ORIG_HEAD и/или reflog и (2) запускать 'git gc --prune = now'. Для того, чтобы лог-файлы истекли «теперь» (так, что эффект '--prune = now' вступает в силу), вы можете запустить' git reflog --expire = now --expire-unreachable = now' в первую очередь. Обратите внимание, что это говорит git, чтобы удалить все ваши механизмы безопасности/восстановления, поэтому вам нужно быть очень уверенным в этом. Вместо этого вы можете использовать 'git reflog delete' для удаления определенных записей (снова посмотрите как на« HEAD », так и на divlog) для более хирургического удара. (Или просто делайте что-нибудь на клоне для безопасности.) – torek

0

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

Однако, если вы хотите принудительно удалить дополнительные коммиты и другие ненужные объекты, вы можете использовать git gc. Если вы хотите, чтобы он удалил как можно больше дополнительных коммитов/объектов (и вам не все равно о скорости), вы можете использовать git gc --aggressive.

Примечание: Технически, D и E больше не находятся в филиале. Филиалы - просто указатели на совершение, у них нет собственной истории (кроме истории конкретных коммитов, на которые они указывают). В результате, когда вы скомпилировали dev, git оставил D и E, если вы захотите получить к ним доступ позже, даже если они больше не находятся на ветке.

+1

На самом деле '--aggressive' просто включает опцию' -f' 'git repack' -f' и устанавливает значения' --depth' и '--window' (до 250 и 250 или любые настройки, которые вы настраиваете для' gc .aggressivedepth' и 'gc.aggressivewindow'). – torek

+0

@torek - в моем опыте 'git gc --aggressive' сделал больше, чем просто это. Я не могу сказать, что конкретно, потому что 100% времени рушится на моей машине из-за изнурительной памяти, тогда как 'git repack' всегда будет работать. –

+0

@AndrewC: интересно, я получил выше, глядя на текущий источник (git 2.2), возможно, в какой-то момент он сделал что-то еще. – torek

Смежные вопросы