Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Удалить/скрыть ветки git без удаления истории коммитов

Автор вопроса: synaptikОтветов: 1

Ситуация:

У меня есть основной репозиторий с основной веткой разработки и множеством "экспериментальных" веток, вырастающих из него (например, exp1 и exp2). Цель этих ветвей эксперимента - служить заполнителями для экспериментов, которые генерируют числовые результаты. Я записываю название ветки (и идентификатор коммита) веток эксперимента, чтобы иметь возможность вернуться к коммитам, чтобы точно увидеть код и историю результатов.

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

Возможное решение:

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

введите здесь описание изображения

Нажмите здесь, чтобы открыть увеличенную версию изображения (на imgur.com).

Так, например, для ветки exp1 я хотел бы экспортировать коммиты A->B->C в отдельный репозиторий с корнем в коммите A. Затем я могу просто записать хэш фиксации P1, чтобы знать, откуда произошла ветвь exp1.

Вопрос:

Как я могу это сделать?

Лучший вопрос:

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

  • Я просто держу отдельное удаленное репозиторий с архивами, в которые помещаю старые ветки, а затем удаляю их из своего локального репозитория. Ajedi32 07.08.2014
  • @Ajedi32 Ajedi32 Звучит как неплохая идея. Как я могу исключить это удаленное репо из команд журнала git? Например, я обычно запускаю git log --oneline --graph --decorate --all. Как я могу изменить эту команду git-log, чтобы не отображать данный пульт? synaptik 07.08.2014
  • Хороший вопрос. Сейчас я сам этим не занимаюсь, так что не уверен. Если узнаешь, обязательно дай мне знать. ;-) Ajedi32 07.08.2014
  • Кроме того, для предлагаемого вами решения вы можете изучить git replace Ajedi32 07.08.2014
  • Просто вопрос: похоже, вы держите ветки exp на случай, если вам нужно будет найти коммит позже. Почему бы вам просто не пометить их, вместо того, чтобы сохранять ветки? sleske 07.08.2014
  • @sleske Может быть, это то, что я должен делать, на самом деле. synaptik 07.08.2014

gitgit-branchgit-branch-sculpting

Ответы

Ответ 1 · рейтинг 29 · torek

Вот одна из альтернатив: используйте ссылки, не относящиеся к ветвям, чтобы сохранить подсказки ветвей перед удалением имен ветвей.

Поскольку это ссылки, не относящиеся к ветвям, они не будут отображаться ни в выводе git branch, ни в материалах, отображаемых, например, git log --branches и gitk --branches. Однако они будут отображаться в списках --all и сохранят объекты репозитория.

Чтобы создать или обновить ссылку без ветки, используйте git update-ref. Выберите пространство имен в refs/, которое, по вашему мнению, не будет конфликтовать с каким-либо будущим использованием (текущее использование: refs/heads/ для веток, refs/tags/ для тегов, refs/remotes/ для удаленных веток, refs/notes/ для заметок и refs/stash для тайника).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы