В моем git-репозитории есть несколько старых веток, которые больше не находятся в активной разработке. Я хотел бы заархивировать ветки, чтобы они не показывались по умолчанию при запуске git branch -l -r
. Я не хочу их удалять, потому что я хочу сохранить историю. Как я могу это сделать?
Я знаю, что возможно создать реф за пределами рефсов / голов. Например, refs/archive/old_branch
. Есть ли какие-либо последствия этого?
git checkout [rev] file
Attic/<branchname>
легкие теги для архивирования веток, хотя.Ответы:
Я считаю, что правильный способ сделать это - пометить ветку. Если вы удалите ветку после того, как отметили ее, то вы фактически сохранили ветку, но она не загромождает ваш список ветвей.
Если вам нужно вернуться в ветку, просто проверьте тег. Это эффективно восстановит ветку из тега.
Для архивации и удаления ветки:
Чтобы восстановить ветку через некоторое время:
История ветки будет сохранена точно так, как это было, когда вы пометили ее.
источник
git checkout -b <branchname> archive/<branchname>
branch -D
поскольку, скорее всего, она не будет полностью объединена, если вы архивируете ее таким образомОтвет Джереми в принципе верен, но ИМХО команды, которые он указывает, не совсем верны.
Вот как заархивировать ветку в тег без необходимости извлекать ветку (и, следовательно, без необходимости извлекать ветку в другую ветку, прежде чем вы сможете удалить эту ветку):
А вот как восстановить ветку:
источник
Да, вы можете создать ссылку с нестандартным префиксом, используя
git update-ref
. напримерgit update-ref refs/archive/old-topic topic && git branch -D topic
git branch topic refs/archive/old-topic
Рефы с нестандартным префиксом (здесь
refs/archive
) не будут отображаться на обычномgit branch
,git log
ниgit tag
. Тем не менее, вы можете перечислить их сgit for-each-ref
.Я использую следующие псевдонимы:
Кроме того, вы можете настроить удаленные устройства, такие как
push = +refs/archive/*:refs/archive/*
автоматическое добавление архивных веток (илиgit push origin refs/archive/*:refs/archive/*
для однократного).Другой способ - записать SHA1 где-нибудь перед удалением ветки, но у него есть ограничения. Коммиты без каких-либо ссылок будут GC'd через 3 месяца (или пару недель без рефлога) , не говоря уже о руководстве
git gc --prune
. Комитеты, указанные рефери, защищены от GC.Редактировать: нашел реализацию perl той же идеи @ap :
git-attic
Редактировать ^ 2: нашел сообщение в блоге, где сам Гитстер использовал ту же технику.
источник
Расширяя ответ Стива, чтобы отразить изменения на пульте, я сделал
Чтобы восстановить с пульта см. Этот вопрос .
источник
Вы можете заархивировать ветки в другом хранилище. Не так элегантно, но я бы сказал, что это жизнеспособная альтернатива.
источник
git-bundle
вместо отдельного хранилища.Вот псевдоним для этого:
Добавьте это так:
Имейте в виду, что
git archive
команда уже существует, поэтому вы не можете использовать ееarchive
в качестве псевдонима.Также вы можете определить псевдоним для просмотра списка «архивных» веток:
о добавлении псевдонимов
источник
!git tag archive/$1 $1 && git branch -D
Я использую следующие псевдонимы, чтобы скрыть заархивированные ветви:
Таким образом,
git br
показать активно развивающиеся ветки иgit bra
показать все ветки, в том числе и «заархивированные» .источник
Я бы не архивировал ветки. Иными словами, ветки архивируют сами. Вы хотите, чтобы информация, относящаяся к археологам, была надежно найдена. Надежный в том, что он помогает в ежедневном развитии и не добавляет дополнительного шага к процессу выполнения работы. То есть, я не верю, что люди не забудут добавить тег, как только они закончат работу с веткой.
Вот два простых шага, которые очень помогут археологии и развитию.
git merge --no-ff
для объединения веток задач; Вы хотите, чтобы коммит слияния и история всплыли, даже для одного коммита.Вот и все. Зачем? Потому что, как археолог-программист, я редко начинаю с того, что хочу узнать, какая работа была проделана на ветке. Гораздо чаще
именно поэтому во всех кричащих девочках код написан таким образом ?!Мне нужно изменить код, но у него есть некоторые странные особенности, и мне нужно разобраться с ними, чтобы не нарушать что-то важное.Следующий шаг -
git blame
найти связанные коммиты, а затем надеяться, что сообщение журнала будет пояснительным. Если мне нужно будет покопаться глубже, я выясню, была ли работа выполнена в ветке, и прочту всю ветку в целом (вместе с ее комментарием в трекере проблем).Скажем,
git blame
указывает на коммит XYZ. Я открываю браузер истории Git (gitk, GitXgit log --decorate --graph
и т. Д.), Нахожу коммит XYZ и вижу ...Там моя ветка! Я знаю, что QQ, UU, XYZ, JJ и MM все являются частью одной и той же ветви, и я должен посмотреть на их сообщения журнала для деталей. Я знаю, что GG будет коммитом слияния и будет иметь название ветви, которая, возможно, связана с проблемой в трекере.
Если по какой-то причине я хочу найти старую ветвь, которую я могу запустить,
git log
и искать имя ветки в коммите слияния. Это достаточно быстро даже на очень больших репозиториях.Вот что я имею в виду, когда говорю, что филиалы сами архивируют.
Добавление тегов к каждой ветви добавляет ненужную работу для достижения цели (критический процесс, который должен быть безжалостно упорядочен), объединяет список тегов (не говоря о производительности, но удобочитаемости) сотнями тегов, которые очень полезны лишь изредка, и не ' даже очень полезно для археологии.
источник
Мой подход состоит в том, чтобы переименовать все ветви, которые меня не интересуют, с префиксом trash_, а затем использовать:
(с привязкой ключа оболочки)
Чтобы сохранить окраску активной ветви, потребуется:
источник
Вы можете использовать скрипт, который заархивирует ветку для вас
archbranch
Он создает для вас тег с префиксом архива /, а затем удаляет ветку. Но проверьте код, прежде чем использовать его.
Использование -
$/your/location/of/script/archbranch [branchname] [defaultbranch]
Если вы хотите запустить скрипт без указания местоположения, добавьте его в свой путь
Тогда вы можете позвонить по
Это
[defaultbranch]
ветвь, к которой он перейдет, когда архивирование будет завершено. Есть некоторые проблемы с цветовым кодированием, но кроме того, что оно должно работать. Я давно использую его в проектах, но он все еще находится в стадии разработки.источник
Я иногда архивирую ветки следующим образом:
format-patch <branchName> <firstHash>^..<lastHash>
(используйте firstHash и lastHash, используяgit log <branchName>
.git branch -D <branchName>
«Примените» патч, когда вам нужно снова использовать ветку; однако применение файлов исправлений (см.
git am
) может быть сложным в зависимости от состояния целевой ветви. С другой стороны, этот подход имеет то преимущество, что позволяет коммитам ветки собирать мусор и экономить место в вашем репо.источник