Описи галузей у Git


282

Чи є спосіб у Git мати "опис" для гілок?

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


1
У мене була подібна проблема . Я використовую цей файл для документування гілок і чому вони існують (серед іншого).
тематика

2
Це було б дійсно корисною функцією. git гілка -a могла показувати описи поруч із назвами гілок. Можливо, git note підтримуватимуть нотатки про гілки, а також коміти в майбутньому?
jhabbott

1
Описи гілок неможливо відсунути, тому вони є досить марними, якщо ви не хочете надсилати повідомлення самому собі.
Нуреттін

@nurettin Щоправда, але все одно мій запит стосувався приватних речей. Мені просто хотілося згадати, чому я вирізав гілку.
Нуфал Ібрагім

Відповіді:


200

Git 1.7.9 підтримує це. З приміток до випуску 1.7.9 :

 * "гілка git --edit-опис" може використовуватися для додавання описового тексту
   пояснити, що таке галузь теми.

Ви можете побачити цю функцію, запроваджену ще у вересні 2011 року, із командами 6f9a332 , 739453a3 , b7200e8 :

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

--edit-description::

Відкрийте редактор і відредагуйте текст, щоб пояснити, для чого потрібна гілка, яка повинна використовуватися різними іншими командами (наприклад request-pull).

Зауважте, що вона не працюватиме для окремої гілки HEAD.

Цей опис використовується при запиті на виклик сценарію: див. Виконувати c016814783 , але також git merge --log.

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

[From @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 checkout , щоб ваш README відображається кожного разу , коли ви перемикаєте гілки.

Наприклад, додайте це в ~ / .gitconfig, під [псевдонім]

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

@michael_n твій псевдонім, це баш псевдонім або 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}. Аналогічно aliasкоманді bash , наприклад, $ 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 знаходиться в кореневому каталозі вашого REPO, він буде працювати з будь-якого шляху, оскільки шлях, який використовується, git showє абсолютним з верхнього каталогу вказаного репо.


3
Чи всі в колективі повинні знати про це і встановлювати це у своєму .gitattribute окремо, якщо вони цього хочуть? Якщо так, мені здається, цим було б важко керувати, і шанси людей, які насправді це роблять, були б малі.
Дон Хетч

@DonHatch: Ви зазвичай перевіряєте .gitattributesфайл у вашому сховищі, так що ні, він би просто працював для всіх. На жаль, це, мабуть, не працює при об'єднанні через деякі веб-інтерфейси, хоча, наприклад, при використанні запитів на виклик в Azure DevOps.
Сорен Бьорнстад

19

Тут є дві популярні пропозиції:

  1. git branch --edit-description: Нам це не подобається, тому що ви не можете його натиснути. Можливо, я пам'ятаю, що роблять створені нами гілки, але моя команда точно не може.
  2. READMEфайл пр. відділення. Це біль під час злиття: Супер схильний до злиття конфліктів, і ми будемо тягнути READMEз гілок, коли ми об’єднуємо гілки функцій. Відмінності між гілками - це також біль.

Ми вирішили створити осиротіле branches-readmeвідділення. Сирочі гілки - це гілки зі своєю окремою історією - ви можете їх знати з Гітбубськоїgh-pages гілок . Ця гілка-сирота містить один 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: Безумовно, але додавання нової гілки вимагає зобов’язання керувати, хоча зміна не має нічого спільного з master. Крім того, коли ви будете відгалужувати майстер, ви матимете копію 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-descriptions/


Це було додано у версії git, яка вийшла після того, як я додав питання. Про це згадується прийнята відповідь.
Нуфал Ібрагім

Ага так. Про це йдеться у коментарях.
Калеб Міллер


-3

Використовуйте

git branch --list -v

щоб показати гілку вище за течією:

git branch --list -vv

Додати -rдля показу лише віддалених або -aдля показу віддалених та локальних.


Як це корисно, я шукаю щось на замовлення. Нотатка якось додається до посилання.
Нуфал Ібрагім

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