Как я могу архивировать ветви git?



У меня есть некоторые старые ветви в моем репозитории git, которые больше не находятся в активной разработке. Я хотел бы архивировать ветви, чтобы они не отображались по умолчанию при запуске git branch-l-r. я не хочу их удалять, потому что хочу сохранить историю. Как я могу это сделать?



Я знаю, что можно создать ref вне refs/heads. Например, refs/archive / old_branch. Есть ли какие-то последствия этого?

837   10  
git

10 ответов:

Я считаю, что правильный способ сделать это, чтобы пометить ветку. Если вы удалите ветку после того, как пометили ее, вы эффективно сохранили ветку, но она не будет загромождать ваш список ветвей.

Если вам нужно вернуться в ветку, просто проверьте тег. Это позволит эффективно восстановить ветку из тега.

для архивирования и удаления ветки:

git tag archive/<branchname> <branchname>
git branch -d <branchname>

чтобы восстановить ветку через некоторое время:

git checkout -b <branchname> archive/<branchname>

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

ответ Джереми в принципе верен, но ИМХО команды, которые он указывает, не совсем правы.

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

> git tag archive/<branchname> <branchname>
> git branch -D <branchname>

а вот как восстановить филиала:

> git checkout -b <branchname> archive/<branchname>

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

git push git://yourthing.com/myproject-archive-branches.git yourbranch
git branch -d yourbranch

Да, вы можете создать ref с некоторым нестандартным префиксом, используя git update-ref. (например,git update-ref refs/archive/old-topic topic)

в отличие от обычных ветвей или тегов, эти ссылки не будут отображаться на обычном git branch,git log, ни git tag (в то время как вы можете видеть их с git log --all).

создание ссылки имеет некоторые преимущества перед простым копированием SHA1. SHA1 достаточно на короткий срок, но коммиты без каких-либо ссылок будут GC'D через 3 месяца (или пару недель без reflog), не говоря уже о ручном git gc --prune. Совершает с рефов от ГК.

Я использую следующие псевдонимы:

[alias]
    archive-ref = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
    list-archive-ref = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
    rem = !git archive-ref
    lsrem = !git list-archive-ref

кроме того, вы можете настроить пульты дистанционного управления, как push = +refs/archive/*:refs/archive/* нажать автоматически (или git push origin refs/archive/*:refs/archive/* за один выстрел).

Edit: нашел perl реализацию той же идеи с помощью @ap:git-attic

Edit^2: нашел блоге где Gitster сам использовал ту же технику.

расширение Стива ответ чтобы отразить изменения на пульте дистанционного управления, я сделал

 git tag archive/<branchname> <branchname>
 git branch -D <branchname>
 git branch -d -r origin/<branchname>
 git push --tags
 git push origin :<branchname>

для восстановления с пульта ДУ см. этот вопрос.

вот псевдоним для этого:

arc    = "! f() { git tag archive/  && git branch -D ;}; f"

добавить так:

git config --global alias.arc '! f() { git tag archive/  && git branch -D ;}; f'

имейте в виду, есть git archive команда уже так что вы не можете использовать archive в качестве псевдонима.

также вы можете определить псевдоним для просмотра списка "архивные" филиалы:

arcl   = "! f() { git tag | grep '^archive/';}; f"

о добавлении псевдонимов

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

[alias]
    br = branch --no-merge master # show only branches not merged into master
    bra = branch                  # show all branches

Так git br показать активно развитые ветви и git bra показать все филиалы, в том числе "архив" те.

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

вот два простых шага, которые помогут археологии и развитие.

  1. свяжите каждую ветвь задачи с соответствующей проблемой в трекере проблем, используя простое соглашение об именах.
  2. всегда использовать git merge --no-ff чтобы объединить ветви задач; вы хотите, чтобы объединить фиксацию и пузырь истории, даже для одной фиксации.

вот и все. Зачем? Потому что как археолог кода, я редко начинаю с желания узнать, какая работа была сделана на ветке. Гораздо чаще именно поэтому во всех кричать девять адов-это код, написанный таким образом?! мне нужно изменить код, но у него есть некоторые странные функции, и мне нужно разгадать их, чтобы не сломать что-то важное.

следующий шаг:git blame найти связанные коммиты, а затем надеяться, что сообщение журнала пояснительной. Если мне нужно копнуть глубже, я узнаю, была ли работа выполнена в ветке и прочитала ветку в целом (вместе с ее комментарием в трекере проблем).

скажем git blame указывает на фиксацию XYZ. Я открываю браузер истории Git (gitk, GitX,git log --decorate --graph и т. д...), найти фиксацию XYZ и посмотреть...

AA - BB - CC - DD - EE - FF - GG - II ...
     \                       /
      QQ - UU - XYZ - JJ - MM

вот моя ветка! Я знаю, что QQ, UU, XYZ, JJ и MM являются частью одной и той же ветви, и я должен посмотреть их сообщения журнала для деталей. Я знаю, что GG будет фиксацией слияния и имеет имя ветви, которая, надеюсь, связана с проблемой в трекере.

если, по какой-то причине, я хочу найти старую ветку, я могу запустить git log поиск для имени ветви в фиксации слияния. Это достаточно быстро даже на очень больших хранилищ.

вот что я имею в виду, когда говорю, что ветви архивируют сами себя.

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

мой подход заключается в переименовании всех ветвей, о которых я не забочусь, с префиксом "trash_", а затем используйте:

git branch | grep -v trash

(С привязкой ключа оболочки)

чтобы сохранить окраску активной ветви, потребуется:

git branch --color=always | grep --color=never --invert-match trash

вы можете использовать скрипт, который будет архивировать для вас филиал

archbranch

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


использование $/your/location/of/script/archbranch [branchname] [defaultbranch]

Если вы хотите запустить скрипт без записи местоположения к нему добавить его в свой путь

затем вы можете назвать его

$ archbranch [branchname] [defaultbranch]

The [defaultbranch] это ветвь, что это будет идти, когда архивирование будет сделано. Есть некоторые проблемы с цветовым кодированием, но другие, что он должен работать. Я использую его в проектах в течение длительного времени, но он все еще находится в стадии разработки.

Comments

    Ничего не найдено.