Описания веток в Git


282

Есть ли способ в Git иметь «описание» для веток?

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


1
У меня была похожая проблема . Я использую этот файл для документирования веток и почему они существуют (между прочим).
Фемида

2
Это было бы действительно полезной функцией. git branch -a может показывать описания рядом с именами веток. Может быть, git notes будет поддерживать заметки на ветках, а также коммиты в будущем?
Джабботт

1
Описания веток нельзя сдвинуть, поэтому они довольно бесполезны, если вы не хотите отправлять сообщения себе.
nurettin

@nurettin Верно, но моя просьба была о личных вещах в любом случае. Я просто хотел вспомнить, почему я срезал ветку.
Нуфал Ибрагим

Ответы:


200

Git 1.7.9 поддерживает это. Из примечаний к выпуску 1.7.9 :

 * "git branch --edit-description" может использоваться для добавления описательного текста
   объяснить, о чем ветка темы.

Вы можете увидеть эту функцию, представленную еще в сентябре 2011 года, с коммитами 6f9a332 , 739453a3 , b7200e8 :

struct branch_desc_cb {
  const char *config_name;
  const char *value;
};

--edit-description::

Откройте редактор и отредактируйте текст, чтобы объяснить, для чего предназначена ветка, которая будет использоваться различными другими командами (например request-pull).

Обратите внимание, что это не будет работать для отдельной ветки HEAD.

Это описание используется сценарием request-pull: см. Commit c016814783 , но также git merge --log.

request-pull является сценарием, используемым для суммирования изменений между двумя коммитами в стандартный вывод, и включает указанный URL в сгенерированную сводку.

[От @AchalDave] К сожалению, вы не можете отправить описания, поскольку они хранятся в вашей конфигурации, что делает их бесполезными для документирования веток в команде.


17
@Owen: единственный способ, который я знаю на данный момент, - это использовать, git config branch.topic.descriptionчтобы показать описание для ветки topic. Он хранится в .git/configфайле.
Грег Хьюгилл

12
@GregHewgill Спасибо. С несколькими псевдонимами это на самом деле неплохой способ просмотра. Теперь если бы только git branchпоказать описания в списке ...
Оуэн

4
В настоящее время гист, цитируемый в предыдущем комментарии, кажется, недоступен, но похоже, что он похож: gist.github.com/carlosayam/5316969
pfalcon

166
К сожалению, вы не можете выдвинуть описания, так как они хранятся в вашей конфигурации, что делает их бесполезными ради документирования веток в команде.
Ачал Дейв

2
@PedroRodrigues, к сожалению, ваша суть ссылки не работает
UpAndAdam

40

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

Например, добавьте это в ~ / .gitconfig под [alias]

cor = !sh -c 'git checkout $1 && cat README' -

После этого вы можете запустить git cor <branch_name>переключение ветви и отобразить README ветви, на которую вы переключаетесь.


Для меня переменная $ 1 не работает - она ​​ничего не содержит. Я не знаю почему (я использую версию 1.7.11-msysgit.1). Я использую $ 0 вместо этого. И все хорошо.
шытиков

@shytikov для псевдонимов git, которые используют аргументы, для переносимости я использую быструю функцию вместо " sh -c"; например,. alias = "!f() { git checkout "${1}" && cat README.md; }; f" (квадратные скобки и кавычки в этом случае не нужны, просто включены для полноты, если они нужны для чего-то более сложного.)
Майкл

@michael_n ваш псевдоним, это псевдоним bash или псевдоним git
UpAndAdam

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

@UpAndAdam это псевдоним git, определенный в ~/.gitconfig, под [alias], и имя псевдонима (и это понятно) вызывает его aliasиз моей реальной конфигурации (я должен был переименовать его, corчтобы этот пример был согласованным). Мой настоящий aliasпсевдоним: alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f" Использование: git alias {alias_name}или git alias {alias_regexp}. По аналогии с командой bash alias, например, $ alias llприводит к (для меня) alias ll='ls -l':; и $ git alias brвыходы: alias.br branch -v --list(также можно использовать: $ git alias 'b.*')
Michael

31

Используйте git branch --edit-descriptionдля установки или редактирования описания ветки.

Вот функция оболочки для отображения веток, похожих на, git branchно с добавленными описаниями.

# Shows branches with descriptions
function gb() {
  current=$(git rev-parse --abbrev-ref HEAD)
  branches=$(git for-each-ref --format='%(refname)' refs/heads/ | sed 's|refs/heads/||')
  for branch in $branches; do
    desc=$(git config branch.$branch.description)
    if [ $branch == $current ]; then
      branch="* \033[0;32m$branch\033[0m"
     else
       branch="  $branch"
     fi
     echo -e "$branch \033[0;36m$desc\033[0m"
  done
}

Вот как gbвыглядит текст, показанный здесь в случае, если изображение гниет:

$ gb
* logging Log order details.  Waiting for clarification from business.
  master 
  sprocket Adding sprockets to the parts list.  Pending QA approval.

И как изображение, чтобы вы могли видеть цвета:

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


Чем он отличается от принятого ответа (опубликованного более года назад)?
Питер Мортенсен


28

READMEПредложил Крис J может работать, при условии , что установка с драйвером пользовательского объединения , определенным в.gitattribute .
Таким образом, локальная версия READMEвсегда сохраняется во время слияний.

«Описание» для ветвей также известно как «комментарий», связанный с этими метаданными, и оно не поддерживается.

По крайней мере, с READMEфайлом вы можете, для любой ветви, сделать:

$ git show myBranch:README

Если ваш README находится в корневом каталоге вашего РЕПО, он будет работать с любого пути, поскольку используемый путь git showявляется абсолютным из верхнего каталога указанного репо.


3
Все ли в команде должны знать об этом и устанавливать это в своем .gitattribute индивидуально, если они этого хотят? Если так, то мне кажется, что это будет трудно справиться, и шансы людей на самом деле сделать это будет невелико.
Дон Хэтч

@DonHatch: вы обычно проверяете .gitattributesфайл в своем хранилище, так что нет, он будет работать для всех. К сожалению, это не работает при объединении через некоторые веб-интерфейсы, например, при использовании запросов на извлечение в DevOps Azure.
Сорен Бьорнстад

19

Здесь есть два популярных предложения:

  1. git branch --edit-description: Нам это не нравится, потому что ты не можешь это подтолкнуть. Может быть, я помню, что делают созданные мной ветки, но моя команда точно не может.
  2. READMEфайл pr. филиал. Это проблема при слияниях: супер-склонна к конфликтам слияний, и мы будем извлекать READMEиз ветвей, когда мы объединяем функциональные ветви. Различия между ветвями - это тоже боль.

Мы решили создать сиротскую branches-readmeветвь. Ветви-сироты - это ветви с собственной историей - вы можете знать их по gh-pagesветкам Github . Эта сиротская ветвь содержит один READMEфайл. У этого есть содержание как:

master:
    The default branch
mojolicious:
    Start using Mojolicious
branch-whatever:
    Description of the whatever branch

Это толкаемый и дружественный к слиянию. Просмотр READMEиз любой ветки с:

git show branches-readme:README

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

Сделай это как:

git checkout --orphan branches-readme
# All the files from the old branch are marked for addition - skip that
git reset --hard
# There are no files yet - an empty branch
ls
vi README
# put in contents similar to above
git add README
git commit -m "Initial description of the branches we already have"
git push origin branches-readme
# get all your original files back
git checkout master

Аналогично, отдельные члены команды могут также создавать свои собственные branches-$userсиротские ветви, описывающие их собственные частные ветви, если они хотят, если они не подталкивают их к команде.

При дальнейшей комплектации это также может быть интегрировано с выводом git branch. С этой целью, возможно, README.yamlфайл может рассматриваться вместо простой README.


Можно было бы просто прочитать README в мастере. Это добавило бы беспорядок, но было бы всегда доступно.
Питер - Восстановить Монику

2
@ PeterA.Schneider: Конечно, но добавление новой ветки потребует фиксации для мастеринга, даже если изменение не имеет ничего общего с мастером. Кроме того, при ветвлении от мастера у вас будет копия README во всех ветвях, что является беспорядком.
Питер В. Мёрч,

10
git config --global --add alias.about '!describe() { git config branch."$1".description; }; describe'

Команда определит глобальную опцию alias.aboutкак выражение оболочки. Запуск git about <branch>в репозитории покажет описание ветки, если установлено.


4
Спасибо! Я изменил его, так что он просто смотрит на ветку, на которой я работаю -"!describe() { git config branch.\"$(git symbolic-ref --short -q HEAD)\".description; }; describe"
Авг

1
@aug - Мне нужно было убрать обратную косую черту перед кавычками, чтобы это сработало:git config --global --add alias.about '!describe() { git config branch."$(git symbolic-ref --short -q HEAD)".description; }; describe'
Том Тресанский

5

Вот возможная реализация команды, на git branchesкоторую ссылается Грег Хьюгилл:

#!/usr/bin/perl

sub clean {
    map { s/^[\s\*]*\s// } @_;
    map { s/\s*$// } @_;
    return @_;
}

sub descr {
    $_ = `git config branch.@_.description`;
    s/\s*$//;
    return $_;
};
sub indent {
    $_ = shift;
    s/^/      /mg;
    return $_;
};

my @branches = clean `git branch --color=never --list`;
my %merged = map { $_ => 1 } clean `git branch --color=never --merged`;

for my $branch (@branches) {
    my $asis = `git branch --list --color=always $branch`;
    $asis =~ s/\s*$//;
    print "  $asis";
    print " \033[33m(merged)\033[0m" if ($merged{$branch} and $branch ne "master");
    print "\n";

    print indent descr $branch;
    print "\n";
    print "\n";
}

4

Вот git aliasчто позволяет вам устанавливать и читать описания текущей ветки:

git config --global --add alias.about '!describe() { msg="$1"; git config branch."$(git rev-parse --abbrev-ref HEAD)".description ${msg:+"$msg"}; }; describe'

Использование / примеры:

(develop) $ git about
(develop) $ git about message
(develop) $ git about
message
(develop) $ git about "this is a new message"
(develop) $ git about
this is a new message
(develop) $ git checkout -b test_branch
Switched to a new branch 'test_branch'
(test_branch) $ git about
(test_branch) $ git about "this is the test branch"
(test_branch) $ git about
this is the test branch
(test_branch) $ git checkout -
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
(develop) $ git about
this is a new message

Отдельное спасибо @Felicio за ответ, с которого я начал.


Ницца! Это можно скомпилировать в оболочку или оммыш?
mqliutie

2

Вы можете прикрепить комментарии к тегам:

git tag -m 'this was a very good commit' tag1

По договоренности у вас могут быть теги, связанные с именами веток, или вы можете использовать тег -f, чтобы оставить закомментированный тег в заголовке веток вашей темы.


13
это не идеально, потому что оно не отслеживает главу филиала
AndyL

1

Скажем, вы хотите создать ветку

git branch branch-20200328
git notes add branch-20200328 -m "This branch is for whatever"
git notes show branch-20200328

0

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


4
Мне придется беспокоиться о (не) слиянии этого файла между ветвями. Не так ли?
Нуфал Ибрагим

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

1
@phresnel: хорошая мысль; я намеревался помочь будущим задавателям этого вопроса и дать хорошие ответы сверху вниз, а неправильные - снизу, чтобы не «наказать» Криса Дж и заставить его потерять репутацию. К сожалению, сайт говорит, что мой голос заблокирован :(.
Каспер ван ден Берг

1
@KaspervandenBerg: Я был немного быстр, чтобы заподозрить вас в наказании, извините.
Себастьян Мах

0

Выбранный ответ кажется мне излишним. Я был бы склонен поддерживать файл описания для каждой ветви, который является нормальным, контролируемым источником файлом, скажем master.txt, dev.txtи т. Д., И если бы было громоздкое число или ветви, я бы создал иерархию, чтобы лучше организовать ее.


6
Тогда вам придется беспокоиться о слиянии этих файлов с любой другой веткой или не забывать использовать, git show master:dev.txtчто не проще, чем выбранный ответ.
Шридхар Ратнакумар

0

Просто используйте:

git config branch.<branch name>.description

Чтобы получить кредит там, где он требуется: https://glebbahmutov.com/blog/git-branches-with-description/


Это было добавлено в версию git, выпущенную после того, как я добавил вопрос. В принятом ответе упоминается это.
Нуфал Ибрагим

О да. Это упоминается в комментариях.
Калеб Миллер


-3

использование

git branch --list -v

показать ветку вверх по течению:

git branch --list -vv

Добавить, -rчтобы показать только пульты или -aпоказать удаленные и локальные.


Как это ни полезно, я ищу что-то нестандартное. Записка какого-то рода прилагается к ссылке.
Нуфал Ибрагим

2
Не показывает описания. Я думаю, что этот ответ вводит в заблуждение.
Пато Сандана
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.