Листинг и удаление Git Chayits, которые находятся под отсутствием ветки (висячие?)

StackOverflow https://stackoverflow.com/questions/3765234

  •  04-10-2019
  •  | 
  •  

Вопрос

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

Я думал, что это висячие комбиниты / дерева выпуска (в результате --d филиала), поэтому я обрезал репо, но я все еще вижу такое же поведение после этого:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

Нет вывода, ничего не висна (справа?). Но дела существует

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

И это не достижимо через любую ветку как

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

не дает вывода.

Что именно является государством этого фиксации? Как я могу перечислить все коммиты в подобном состоянии? Как я могу удалить коммиты, как те?

Это было полезно?

Решение

Нет вывода, ничего не висна (справа?)

Обратите внимание, что коммиты, указанные из вашего Refrogrand, считаются достижимыми.

Что именно является государством этого фиксации? Как я могу перечислить все коммиты с аналогичным состоянием

Проходить --no-reflogs убедить git fsck чтобы показать их вам.

Как я могу удалить коммиты, как те?

Как только ваши записи Refroge истекли, эти объекты будут также очищены git gc.

Истечение регулируется gc.pruneexpire, gc.reflogexpire, а также gc.reflogexpireunreachable настройки. Ср git help config.

По умолчанию все вполне разумные.

Другие советы

Чтобы удалить все висячие коммиты, и этими доступными из Refrogs делают это:

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

Но будьте уверены, что это то, что вы хотите. Я рекомендую вам прочитать страницы человека, но вот источник:

git gcУдаляет недоступные объекты (коммиты, деревья, лобсы (файлы)). Объект недоступен, если это не является частью истории некоторых ветвей. На самом деле это немного сложнее:

git gc Есть ли другие вещи, но они не актуальны здесь и не опасны.

Недоступные объекты, которые моложе двух недель не удаляются, поэтому мы используем --prune=now Что означает «удалить недостижимые объекты, которые были созданы до сих пор».

Объекты также могут быть достигнуты через Refrog. В то время как филиалы записывают историю некоторых проектов, Refrogs записывают историю этих филиалов. Если вы поправляете, сбросьте и т. Д. Обиты удаляются из истории ветви, но Git удерживает их в том случае, если вы понимаете, что вы допустили ошибку. Refrogs - это удобный способ выяснить, какие разрушительные (и другие) операции были выполнены на ветви (или на голове), облегчая отменить разрушительную операцию.

Таким образом, мы также должны удалить Refrogles, чтобы на самом деле удалить все, не дойденное от ветки. Мы делаем это, истекающие --all Refrogs. Опять git держит немного отражателей для защиты пользователей, поэтому мы снова должны сказать, что не делать этого: --expire-unreachable=now.

Так как я в основном использую Refrold для восстановления от разрушительных операций, которые я обычно использую --expire=now Вместо этого, который полностью заворачивает отражения.

У меня была такая же проблема, все еще после выполнения всех советов в этой теме:

git reflog expire --expire-unreachable=now --all
git gc --prune=now
git fsck --unreachable --no-reflogs   # no output
git branch -a --contains <commit>     # no output
git show <commit>                     # still shows up

Если это не отрасль, а не ветка, ... это должно быть метка!

git tag                             # showed several old tags created before the cleanup

Я удалил теги с git tag -d <tagname> И передиснул очистку, а старые коммиты исчезли.

git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

вероятно, просто нужно быть

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

Также сообщать о филиалах от пультов

У меня была подобная проблема. Я побежал git branch --contains <commit>, И не вернулся без вывода, как и в вопросе.

Но даже после бега

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

Мой коммит все еще был доступен, используя git show <commit>. Отказ Это было потому, что один из коммитов в его отдельной / болванской «ветви» был помечен. Я удалил тег, снова запустил вышеупомянутые команды, и я был золотой. git show <commit> вернулся fatal: bad object <commit> - Точно то, что мне нужно. Надеюсь, это поможет кому-то еще, что было так же застряло, как я.

git gc --prune=<date> По умолчанию для пренедельника объектов старше двух недель назад. Вы могли бы установить более позднюю дату. Но, командам GIT, которые создают свободные объекты, как правило, будут работать Git GC --auto (которые черньят свободные объекты, если их число превышает значение вариабельной настройки gc.auto).

Вы уверены, что хотите удалить эти коммиты? Настройка по умолчанию GC.Auto гарантирует, что свободные объекты не занимают необоснованное количество памяти, и хранение свободных объектов в течение некоторого количества времени, как правило, является хорошей идеей. Таким образом, если вы будете реализовать завтра, что ваша удаленная ветка содержала нужную коммит, вы можете восстановить его.

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

Это то, что я сделал, чтобы сделать это действительно недоступным.

git stash clear
git reflog expire --expire-unreachable=now --all
git fsck --unreachable
git gc --prune=now
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top