คำอธิบายสาขาใน Git


282

มีวิธีใน Git ที่จะมี 'คำอธิบาย' สำหรับสาขาหรือไม่?

ในขณะที่ฉันพยายามใช้ชื่อที่เป็นคำอธิบายการทำงานเป็นระยะเวลาหนึ่งในสาขาเดียวบางครั้งทำให้ความจำของฉันแย่ลงเพราะเหตุใดฉันจึงสร้างหัวข้อย่อยบางหัวข้อ ฉันพยายามใช้ชื่อที่เป็นคำอธิบายสำหรับสาขา แต่ฉันคิดว่า 'คำอธิบาย' (โน้ตสั้น ๆ เกี่ยวกับวัตถุประสงค์ของสาขา) จะดี


1
ผมมีปัญหาที่คล้ายกัน ฉันใช้ไฟล์นั้นเพื่อจัดทำเอกสารสาขาและสาเหตุที่มีอยู่ (เหนือสิ่งอื่นใด)
themis

2
นี่จะเป็นคุณสมบัติที่มีประโยชน์จริงๆ git branch- สามารถแสดงคำอธิบายถัดจากชื่อสาขา บางทีบันทึก git จะสนับสนุนบันทึกในสาขารวมถึงความมุ่งมั่นในอนาคตหรือไม่
jhabbott

1
ไม่สามารถผลักดันคำอธิบายสาขาได้ดังนั้นจึงไม่มีประโยชน์เว้นแต่คุณต้องการส่งข้อความถึงตัวคุณเอง
nurettin

@nurettin True แต่คำขอของฉันสำหรับเรื่องส่วนตัวอยู่ดี ฉันแค่อยากจะจำว่าทำไมฉันถึงตัดกิ่งไม้
Noufal Ibrahim

คำตอบ:


200

Git 1.7.9 รองรับสิ่งนี้ จากบันทึกประจำรุ่น 1.7.9 :

 * "git branch --edit-description" สามารถใช้เพื่อเพิ่มข้อความอธิบาย
   เพื่ออธิบายว่าหัวข้อเกี่ยวกับสาขาใด

คุณจะเห็นคุณลักษณะนั้นเปิดตัวในเดือนกันยายน 2554 โดยมีข้อผูกพัน6f9a332 , 739453a3 , b7200e8 :

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

--edit-description::

เปิดโปรแกรมแก้ไขและแก้ไขข้อความเพื่ออธิบายว่าสาขานั้นมีไว้เพื่อใช้งานโดยคำสั่งอื่น ๆ (เช่นrequest-pull)

โปรดทราบว่าจะไม่ทำงานกับสาขา HEAD เดี่ยว

คำอธิบายนั้นถูกใช้โดยสคริปต์ request-pull: ดูการกระทำ c016814783แต่ก็เช่นgit merge --logกัน

request-pull เป็นสคริปต์ที่ใช้ในการสรุปการเปลี่ยนแปลงระหว่างสองคอมมิทกับเอาต์พุตมาตรฐานและรวม URL ที่กำหนดไว้ในข้อมูลสรุปที่สร้างขึ้น

[จาก @AchalDave] น่าเสียดายที่คุณไม่สามารถผลักดันคำอธิบายได้เนื่องจากมันถูกเก็บไว้ในรูปแบบของคุณทำให้มันไร้ประโยชน์สำหรับการบันทึกสาขาในทีม


17
@Owen: วิธีเดียวที่ฉันรู้ในขณะนี้คือการใช้เพื่อแสดงรายละเอียดของสาขาgit config branch.topic.description topicมันเก็บไว้ใน.git/configไฟล์
Greg Hewgill

12
@ GregHewgill ขอบคุณ ด้วยนามแฝงบางอย่างที่จริงแล้วมันไม่ใช่วิธีที่ดีในการดู ตอนนี้ถ้าgit branchจะแสดงคำอธิบายในรายการเท่านั้น ...
โอเว่น

4
ในขณะนี้ดูเหมือนว่าส่วนสำคัญที่อ้างถึงในความคิดเห็นก่อนหน้าจะไม่สามารถใช้ได้ แต่สิ่งนี้ดูเหมือนจะคล้ายกัน: gist.github.com/carlosayam/5316969
pfalcon

166
น่าเสียดายที่คุณไม่สามารถผลักดันคำอธิบายได้เนื่องจากมันถูกเก็บไว้ในการกำหนดค่าของคุณทำให้มันไร้ประโยชน์เพราะการจัดทำเอกสารสาขาในทีม
Achal Dave

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

@shytikov สำหรับนามแฝง git ที่ใช้อาร์กิวเมนต์เพื่อความสะดวกในการพกพาฉันใช้ฟังก์ชั่นด่วนแทน " sh -c"; เช่น,. alias = "!f() { git checkout "${1}" && cat README.md; }; f" (วงเล็บและคำพูดที่ไม่จำเป็นในกรณีนี้รวมเพียงเพื่อความสมบูรณ์ในกรณีที่มีความจำเป็นสำหรับบางสิ่งบางอย่างที่มีความซับซ้อนมากขึ้น.)
ไมเคิล

@michael_n นามแฝงของคุณคือนามแฝงทุบตีหรือนามแฝงคอมไพล์
UpAndAdam

ปัญหาเดียวก็คือถ้า README ไม่ได้อยู่ในโฟลเดอร์ที่คุณอยู่เมื่อคุณเช็คเอาท์มันก็บ่น
UpAndAdam

@UpAndAdam มันเป็นนามแฝงคอมไพล์ที่กำหนดไว้ใน~/.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.*')
ไมเคิล

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.

และในฐานะที่เป็นรูปภาพคุณจึงสามารถดูสีต่างๆได้:

ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้แตกต่างจากคำตอบที่ยอมรับ (โพสต์ก่อนหน้านี้มากกว่าหนึ่งปี) อย่างไร
Peter Mortensen


28

READMEแนะนำโดยคริสเจสามารถทำงานให้มันมีการติดตั้งด้วยโปรแกรมควบคุมการผสานที่กำหนดเองที่กำหนดไว้ใน .gitattribute
ด้วยวิธีนี้รุ่นท้องถิ่นของREADMEจะถูกเก็บรักษาไว้เสมอในระหว่างการรวม

"คำอธิบาย" สำหรับสาขานั้นทราบว่าเป็น "ความคิดเห็น" ที่เชื่อมโยงกับข้อมูลเมตานั้นและไม่ได้รับการสนับสนุน

อย่างน้อยREADMEคุณสามารถทำได้สำหรับสาขาใด ๆ ด้วย:

$ git show myBranch:README

หาก README ของคุณอยู่ที่ไดเรกทอรีรากของ REPO ของคุณมันจะทำงานจากเส้นทางใด ๆ เนื่องจากเส้นทางที่ใช้โดยgit showเป็นเส้นทางที่แน่นอนจากไดเรกทอรีบนสุดของ repo ดังกล่าว


3
ทุกคนในทีมจะต้องตระหนักถึงสิ่งนี้และตั้งค่าเป็น. gitattribute ทีละรายการหากพวกเขาต้องการหรือไม่ ถ้าเป็นเช่นนั้นดูเหมือนว่าฉันจะจัดการได้ยากและโอกาสของคนที่ทำมันจะผอม
Don Hatch

@DonHatch: โดยปกติคุณตรวจสอบ.gitattributesไฟล์ลงในที่เก็บของคุณดังนั้นไม่มันจะใช้ได้กับทุกคน โชคไม่ดีที่ดูเหมือนว่าจะไม่ทำงานเมื่อรวมผ่านอินเทอร์เฟซบนเว็บบางอย่างเช่นเมื่อใช้คำขอดึงใน Azure DevOps
Soren

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.yamlREADME


หนึ่งอาจมี README ในต้นแบบ ที่จะเพิ่มความยุ่งเหยิง แต่สามารถเข้าถึงได้เสมอ
Peter - Reinstate Monica

2
@ PeterA.Schneider: แน่นอน แต่จากนั้นการเพิ่มสาขาใหม่จะต้องมีความมุ่งมั่นที่จะโทแม้ว่าการเปลี่ยนแปลงจะไม่มีอะไรเกี่ยวข้องกับปริญญาโท นอกจากนี้เมื่อแยกออกจากต้นแบบคุณจะมีสำเนาของ README ในทุกสาขาซึ่งเป็นระเบียบ
Peter V. Mørch

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'
Tom Tresansky

5

นี่คือการปฏิบัติที่เป็นไปได้ของgit branchesคำสั่ง Greg Hewgill พูดถึง:

#!/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 เป็นพิเศษสำหรับคำตอบที่ทำให้ฉันเริ่มต้น


ดี! มันสามารถคอมไพล์เชลล์หรือ ohmyzsh ได้ไหม?
mqliutie

2

คุณสามารถแนบความคิดเห็นกับแท็ก:

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

ตามแบบแผนคุณอาจมีแท็กที่เกี่ยวข้องกับชื่อสาขาของคุณหรือคุณสามารถใช้ tag -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
ฉันต้องกังวลเกี่ยวกับ (ไม่) รวมไฟล์นี้ข้ามสาขา ฉันจะไม่
Noufal Ibrahim

1
@KaspervandenBerg: อาจจะแค่แสดงความคิดเห็นแทนการดึง -1 การ์ดออกมาแล้วรอสักครู่และหากผู้ถามไม่เต็มใจเปลี่ยนโพสต์ แต่คุณเห็นเขา / เธอ / มันเยี่ยมชมเว็บไซต์นี้ในขณะเดียวกัน สะกดมัน. หรือคุณตรวจสอบคำตอบทั้งหมดของคุณเป็นประจำเพื่อดูว่าพวกเขายังคงถูกต้องหรือไม่?
เซบาสเตียนมัค

1
@phresnel: จุดดี; ความตั้งใจของฉันคือการช่วยให้ผู้ถามในอนาคตของคำถามนี้และมีคำตอบที่ดีไปยังด้านบนและด้านล่างที่ไม่ถูกต้องไม่ใช่ "ลงโทษ" Chris J และทำให้เขาเสียชื่อเสียง น่าเสียดายที่เว็บไซต์แจ้งว่าการลงคะแนนของฉันถูกล็อค :(
Kasper van den Berg

1
@ KaspervandenBerg: ฉันค่อนข้างเร็วที่จะสงสัยว่าคุณจะลงโทษขอโทษ
เซบาสเตียนมัค

0

คำตอบที่เลือกดูเหมือนจะเกินความคาดหมายสำหรับฉัน ฉันจะมีความโน้มเอียงที่จะรักษาต่อสาขาไฟล์คำอธิบายที่เป็นแหล่งควบคุมไฟล์ปกติพูดmaster.txt, dev.txtฯลฯ และถ้ามีจำนวนเทอะทะหรือสาขาที่ฉันสร้างลำดับชั้นจะดีกว่าจัดระเบียบ


6
จากนั้นคุณต้องกังวลเกี่ยวกับการรวมไฟล์เหล่านี้เข้ากับสาขาอื่น ๆ หรืออย่าลืมใช้git show master:dev.txtซึ่งไม่ง่ายกว่าคำตอบที่เลือก
Sridhar Ratnakumar

0

เพียงใช้:

git config branch.<branch name>.description

ในการให้เครดิตในกรณีที่เครดิตครบกำหนด: https://glebbahmutov.com/blog/git-branches-with-descriptions/


สิ่งนี้ถูกเพิ่มเข้ามาในคอมไพล์รุ่นที่เผยแพร่หลังจากที่ฉันเพิ่มคำถาม คำตอบที่ได้รับการกล่าวถึงนี้
Noufal Ibrahim

อ่าใช่ มันถูกกล่าวถึงในความคิดเห็น
แม็กเคเล็บมิลเลอร์


-3

ใช้

git branch --list -v

เพื่อแสดงสาขาต้นน้ำ:

git branch --list -vv

เพิ่ม-rเพื่อแสดงรีโมตเท่านั้นหรือ-aเพื่อแสดงรีโมตและโลคัล


มีประโยชน์อย่างที่ฉันคิดไว้ หมายเหตุบางชนิดที่แนบมากับข้อมูลอ้างอิง
Noufal Ibrahim

2
มันไม่แสดงคำอธิบาย ฉันคิดว่าคำตอบนี้ทำให้เข้าใจผิด
Pato Sandaña
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.