Mô tả chi nhánh trong Git


282

Có cách nào trong Git để có một 'mô tả' cho các chi nhánh không?

Trong khi tôi cố gắng sử dụng tên mô tả, làm việc một lúc trên một nhánh đôi khi làm giảm trí nhớ của tôi về lý do tại sao tôi thực hiện một số nhánh chủ đề khác. Tôi cố gắng sử dụng tên mô tả cho các chi nhánh, nhưng tôi nghĩ rằng một "mô tả" (ghi chú ngắn về mục đích của chi nhánh) sẽ tốt.


1
Tôi đã có một vấn đề tương tự . Tôi sử dụng tập tin đó để ghi lại các nhánh và lý do tại sao chúng tồn tại (trong số những thứ khác).
themis

2
Đây sẽ là một tính năng thực sự hữu ích. nhánh git -a có thể hiển thị các mô tả bên cạnh tên nhánh. Có lẽ git ghi chú sẽ hỗ trợ ghi chú trên các chi nhánh cũng như cam kết trong tương lai?
jhabbott

1
Mô tả chi nhánh không thể được đẩy, vì vậy chúng khá vô dụng trừ khi bạn muốn gửi tin nhắn cho chính mình.
Nurettin

@nurettin Đúng nhưng yêu cầu của tôi là cho những thứ riêng tư nào. Tôi chỉ muốn nhớ tại sao tôi cắt cành.
Noufal Ibrahim

Câu trả lời:


200

Git 1.7.9 hỗ trợ này. Từ ghi chú phát hành 1.7.9 :

 * "git nhánh --edit-description" có thể được sử dụng để thêm văn bản mô tả
   để giải thích những gì một nhánh chủ đề là về.

Bạn có thể thấy tính năng đó được giới thiệu trở lại vào tháng 9 năm 2011, với các cam kết 6f9a332 , 739453a3 , b7200e8 :

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

--edit-description::

Mở trình soạn thảo và chỉnh sửa văn bản để giải thích chi nhánh dùng để làm gì, được sử dụng bởi nhiều lệnh khác (ví dụ request-pull).

Lưu ý rằng nó sẽ không hoạt động cho một chi nhánh CHÍNH.

Mô tả đó được sử dụng bởi tập lệnh request-pull: xem commit c016814783 , nhưng cũng có git merge --log.

request-pull là một tập lệnh được sử dụng để tóm tắt các thay đổi giữa hai lần cam kết với đầu ra tiêu chuẩn và bao gồm URL đã cho trong tóm tắt được tạo.

[Từ @AchalDave] Thật không may, bạn không thể đẩy các mô tả vì chúng được lưu trữ trong cấu hình của bạn, khiến nó trở nên vô dụng vì mục đích ghi lại các nhánh trong một nhóm.


17
@Owen: Cách duy nhất tôi biết vào lúc này là sử dụng git config branch.topic.descriptionđể hiển thị mô tả cho chi nhánh topic. Nó được lưu trữ trong .git/configtập tin.
Greg Hewgill

12
@GregHewgill Cảm ơn bạn. Với một vài bí danh thực sự không phải là một cách tồi để xem nó. Bây giờ nếu chỉ git branchhiển thị các mô tả trong danh sách ...
Owen

4
Tại thời điểm này, ý chính được trích dẫn trong comment trước đó dường như không có sẵn, nhưng xuất hiện này là tương tự: gist.github.com/carlosayam/5316969
pfalcon

166
Thật không may, bạn không thể đẩy các mô tả vì chúng được lưu trữ trong cấu hình của bạn, khiến nó trở nên vô dụng vì mục đích ghi lại các nhánh trong một nhóm.
Achal Dave

2
@PedroRodrigues đáng buồn là liên kết chính của bạn bị hỏng
UpAndAdam

40

Nếu bạn làm kết thúc bằng cách sử dụng README, tạo một bí danh git sửa đổi git checkoutđể README của bạn sẽ được hiển thị mỗi khi bạn chuyển đổi các chi nhánh.

Ví dụ: thêm phần này vào ~ / .gitconfig, trong [bí danh]

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

Sau này, bạn có thể chạy git cor <branch_name>để chuyển nhánh hiển thị README của nhánh bạn đang chuyển sang.


Đối với tôi, biến $ 1 không hoạt động - nó không chứa gì. Tôi không biết tại sao (Tôi đang sử dụng phiên bản 1.7.11-msysgit.1). Tôi đang sử dụng $ 0 thay thế. Và mọi thứ đều ổn.
shytikov

@shytikov cho các bí danh git sử dụng đối số, vì tính di động, tôi sử dụng hàm nhanh thay vì " sh -c"; ví dụ,. alias = "!f() { git checkout "${1}" && cat README.md; }; f" (dấu ngoặc và trích dẫn không cần thiết trong trường hợp này, chỉ bao gồm để hoàn thiện trong trường hợp cần thiết cho một cái gì đó phức tạp hơn.)
michael

@michael_n bí danh của bạn, đó là bí danh bash hay bí danh git
UpAndAdam

Vấn đề duy nhất là nếu README không có trong thư mục bạn đang ở khi bạn kiểm tra thì nó chỉ phàn nàn.
UpAndAdam

@UpAndAdam đó là một bí danh git, được định nghĩa trong ~/.gitconfig, bên dưới [alias]và tên của bí danh trên thực tế (và có thể hiểu một cách dễ hiểu) được gọi aliastừ cấu hình thực tế của tôi (tôi nên đổi tên nó thành corví dụ này để thống nhất). aliasBí danh thực tế của tôi là: alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f" Cách sử dụng: git alias {alias_name}hoặc git alias {alias_regexp}. Tương tự như aliaslệnh bash , ví dụ, $ alias llsản lượng (đối với tôi) : alias ll='ls -l'; và $ git alias brsản lượng: alias.br branch -v --list(cũng có thể sử dụng $ git alias 'b.*':)
michael

31

Sử dụng git branch --edit-descriptionđể đặt hoặc chỉnh sửa mô tả chi nhánh.

Đây là một hàm shell để hiển thị các nhánh tương tự git branchnhưng có thêm phần mô tả.

# 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
}

Đây là những gì gbtrông giống như, được hiển thị ở đây dưới dạng văn bản trong trường hợp hình ảnh rots:

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

Và như một hình ảnh, vì vậy bạn có thể thấy màu sắc:

nhập mô tả hình ảnh ở đây


Làm thế nào khác với câu trả lời được chấp nhận (được đăng hơn một năm trước)?
Peter Mortensen


28

Đề READMExuất của Chris J có thể hoạt động, miễn là nó được thiết lập với trình điều khiển hợp nhất tùy chỉnh được xác định trong a.gitattribute .
Bằng cách đó, phiên bản địa phương của READMEluôn được bảo tồn trong quá trình hợp nhất.

"Mô tả" cho các nhánh cũng được gọi là "nhận xét" được liên kết với dữ liệu meta đó và nó không được hỗ trợ.

Ít nhất, với một READMEtệp, bạn có thể, đối với bất kỳ chi nhánh nào, hãy thực hiện:

$ git show myBranch:README

Nếu README của bạn nằm trong thư mục gốc của REPO, nó sẽ hoạt động từ bất kỳ đường dẫn nào, vì đường dẫn được sử dụng git showlà một đường dẫn tuyệt đối từ thư mục trên cùng của repo đã nói.


3
Có phải tất cả mọi người trong nhóm phải nhận thức được điều này và đặt nó trong .gitattribution riêng nếu họ muốn? Nếu vậy, có vẻ như điều này đối với tôi điều này sẽ khó quản lý và cơ hội để mọi người thực sự làm điều đó sẽ rất mong manh.
Don nở

@DonHatch: Bạn thường kiểm tra .gitattributestệp vào kho lưu trữ của mình, vì vậy không, nó sẽ chỉ hoạt động cho tất cả mọi người. Thật không may, điều này dường như không hoạt động khi hợp nhất thông qua một số giao diện dựa trên web, ví dụ: khi sử dụng các yêu cầu kéo trong Azure DevOps.
Soren Bjornstad

19

Có hai gợi ý phổ biến ở đây:

  1. git branch --edit-description: Chúng tôi không thích điều này bởi vì bạn không thể đẩy nó. Có lẽ tôi có thể nhớ những chi nhánh tôi tạo ra, nhưng nhóm của tôi chắc chắn không thể.
  2. READMEtập tin pr. chi nhánh. Đây là một nỗi đau trong quá trình hợp nhất: Siêu dễ hợp nhất các xung đột và chúng tôi sẽ kéo vào READMEtừ các chi nhánh khi chúng tôi hợp nhất các nhánh tính năng. Khác biệt giữa các nhánh cũng là một nỗi đau.

Chúng tôi đã quyết định tạo ra một branches-readmechi nhánh mồ côi . Các nhánh mồ côi là các nhánh có lịch sử riêng biệt - bạn có thể biết chúng từ gh-pagescác nhánh của Github . Chi nhánh mồ côi này chứa một READMEtập tin duy nhất . Nó có nội dung như:

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

Nó có khả năng đẩy và hợp nhất thân thiện. Xem READMEtừ bất kỳ chi nhánh với:

git show branches-readme:README

Nhược điểm là bạn cần kiểm tra chi nhánh mồ côi kỳ lạ khi bạn muốn cập nhật READMEREADMEkhông tự động cập nhật khi các chi nhánh được đổi tên, đến hoặc đi. Điều đó là tốt cho chúng tôi, mặc dù.

Làm như thế:

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

Similary, các thành viên trong nhóm riêng lẻ cũng có thể tạo các branches-$usernhánh mồ côi của riêng họ mô tả các nhánh riêng của họ nếu họ muốn, miễn là họ không đẩy họ vào nhóm.

Với công cụ tiếp theo, điều này cũng có thể được tích hợp với đầu ra của git branch. Cuối cùng, có lẽ một README.yamltập tin có thể được xem xét thay vì đơn giản README.


Người ta chỉ có thể có README trong chủ. Điều đó sẽ thêm lộn xộn nhưng luôn luôn có thể truy cập.
Peter - Tái lập Monica

2
@ PeterA.Schneider: Chắc chắn, nhưng sau đó thêm một chi nhánh mới sẽ yêu cầu một cam kết thành thạo mặc dù sự thay đổi không liên quan gì đến chủ nhân. Ngoài ra, khi phân nhánh chủ, bạn sẽ có một bản sao README trong tất cả các nhánh, đó là một mớ hỗn độn.
Peter V. Mørch

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

Lệnh sẽ định nghĩa một tùy chọn toàn cục alias.aboutlà biểu thức shell. Chạy git about <branch>trong một kho lưu trữ sẽ hiển thị mô tả của chi nhánh nếu được đặt.


4
Cảm ơn! Tôi đã thay đổi nó để nó chỉ nhìn vào chi nhánh Tôi đang trên -"!describe() { git config branch.\"$(git symbolic-ref --short -q HEAD)\".description; }; describe"
Tháng Tám

1
@aug - Tôi cần bỏ dấu gạch chéo ngược trước dấu ngoặc kép của đối số để làm việc này:git config --global --add alias.about '!describe() { git config branch."$(git symbolic-ref --short -q HEAD)".description; }; describe'
Tom Tresansky

5

Đây là một triển khai có thể của git brancheslệnh Greg Hewgill đã ám chỉ:

#!/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

Đây là một git aliascho phép bạn đặt và đọc mô tả trên nhánh hiện tại:

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

Cách sử dụng / ví dụ:

(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

Đặc biệt cảm ơn @Felermo vì câu trả lời đã giúp tôi bắt đầu.


Đẹp! Nó có thể được biên dịch sang shell hay ohmyzsh?
mqliutie

2

Bạn có thể đính kèm ý kiến ​​vào thẻ:

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

Theo quy ước, bạn có thể có các thẻ liên quan đến tên chi nhánh của mình hoặc bạn có thể sử dụng thẻ -f để giữ thẻ nhận xét ở đầu chi nhánh chủ đề của mình.


13
Điều này không lý tưởng vì nó không theo dõi người đứng đầu chi nhánh
AndyL

1

Nói rằng bạn muốn tạo một chi nhánh

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

0

Tôi khá chắc chắn rằng tính năng này hiện không được hỗ trợ. Tôi nghĩ rằng cách tốt nhất của bạn là tạo một tệp văn bản mô tả, về cơ bản là README, trong nhánh có thông tin mà bạn muốn.


4
Tôi phải lo lắng về việc (không) hợp nhất tệp này giữa các chi nhánh. Tôi sẽ không
Noufal Ibrahim

1
@KaspervandenBerg: Có thể chỉ cần để lại nhận xét thay vì rút thẻ -1, sau đó đợi một lúc và nếu người hỏi không sẵn sàng thay đổi bài đăng, nhưng bạn sẽ thấy anh ấy / cô ấy truy cập trang web này trong khi đó, đánh vần từ đó. Hoặc bạn có thường xuyên kiểm tra tất cả các câu trả lời của bạn để xem liệu chúng có còn đúng không?
Sebastian Mach

1
@phresnel: điểm tốt; ý định của tôi là giúp những người hỏi trong tương lai của câu hỏi này và đưa những người đánh giá tốt lên đầu và không chính xác để xuống đáy, đó không phải là để "trừng phạt" Chris J và khiến anh ta mất đi danh tiếng. Thật không may, trang web nói rằng phiếu bầu của tôi bị khóa :(.
Kasper van den Berg

1
@KaspervandenBerg: Tôi đã hơi nhanh chóng nghi ngờ bạn trừng phạt, xin lỗi.
Sebastian Mach

0

Câu trả lời được chọn có vẻ như quá mức cần thiết với tôi. Tôi muốn được xu hướng duy trì cho mỗi chi nhánh tập tin mô tả đó là một điều khiển nguồn tập tin bình thường, chẳng hạn master.txt, dev.txtvv và nếu có một số khó sử dụng hoặc chi nhánh Tôi muốn tạo ra một hệ thống phân cấp để tổ chức tốt hơn nó.


6
Sau đó, bạn phải lo lắng về việc hợp nhất các tệp này với mọi chi nhánh khác hoặc nhớ sử dụng git show master:dev.txtkhông đơn giản hơn câu trả lời đã chọn.
Sridhar Ratnakumar

0

Chỉ dùng:

git config branch.<branch name>.description

Để cung cấp tín dụng khi tín dụng đáo hạn: https://glebbahmutov.com/blog/git-branches-with-descrip/


Điều này đã được thêm vào trong một phiên bản git được phát hành sau khi tôi thêm câu hỏi. Câu trả lời được chấp nhận đề cập đến điều này.
Noufal Ibrahim

À đúng rồi. Nó được đề cập trong các ý kiến.
Caleb Miller


-3

Sử dụng

git branch --list -v

để hiển thị một nhánh ngược dòng:

git branch --list -vv

Thêm vào -rđể hiển thị từ xa chỉ hoặc -ađể hiển thị điều khiển từ xa và địa phương.


Hữu ích vì đây là, tôi đang tìm kiếm một cái gì đó tùy chỉnh. Một lưu ý của một số loại đính kèm với một tài liệu tham khảo.
Noufal Ibrahim 7/8/2015

2
Nó không hiển thị mô tả. Tôi nghĩ rằng câu trả lời này là sai lệch.
Pato Sandaña
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.