Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

6 สคริปต์ทุบตีที่มีประโยชน์สำหรับ Git

ฉันเขียนสคริปต์ Bash จำนวนมากที่ทำให้ชีวิตของฉันง่ายขึ้นเมื่อฉันทำงานกับที่เก็บ Git เพื่อนร่วมงานของฉันหลายคนบอกว่าไม่จำเป็น ว่าทุกอย่างที่ฉันต้องทำสามารถทำได้ด้วยคำสั่ง Git แม้ว่านั่นอาจเป็นจริง แต่ฉันพบว่าสคริปต์สะดวกกว่าการพยายามหาคำสั่ง Git ที่เหมาะสมเพื่อทำในสิ่งที่ฉันต้องการ

1. gitlog

gitlog พิมพ์รายการย่อของแพตช์ปัจจุบันเทียบกับเวอร์ชันหลัก โดยจะพิมพ์จากเก่าที่สุดไปใหม่สุด และแสดงผู้เขียนและคำอธิบายด้วย H สำหรับ หัว , ^ สำหรับ HEAD^ , 2 สำหรับ HEAD~2 และอื่นๆ ตัวอย่างเช่น:

$ gitlog
----------------------[ recovery25 ]--------------- --------
(snip)
11 340d27a33895 Bob Peterson     gfs2:ระบายรายการ ail2 หลังจากข้อผิดพลาด io
10 9b3c4e6efb10 Bob Peterson     gfs2:ทำความสะอาด iopen glock mess ใน gfs2_create_inode
 9 d2e8c22be39b Bob Peterson     gfs2:ทำการตรวจสอบข้อผิดพลาดอย่างเหมาะสมสำหรับกลุ่ม go_sync ของ glops
 8 9563e31f8bfd Christoph Hellwig gfs2:use page_offset in gfs2_page_mkwrite
 7 ebaccing:br /> 6 f703a3c27874 Andreas Gruenbacher gfs2:ปรับปรุงการเขียน mmap เทียบกับความสอดคล้องของ punch_hole
 5 a3e86d2ef30e Andreas Gruenbacher gfs2:การจัดสรรหลายบล็อกใน gfs2_page_mkruwrite
 475s da3 gfs2_page_mkwrite
 3 4525c2f5b46f Bob Peterson     เครื่องมือแผ่นพื้นของ Rafael Aquini
 2 a06a5b7dea02 Bob Peterson     GFS2:เพิ่ม go_get_holdtime ให้กับ gl_ops
 ^ 5bac93c796 Peterson     gfs2:แนะนำฟังก์ชันใหม่ left_hold_time และใช้ใน dq
 H e8b5ff851bb9 Bob Peterson     gfs2:อนุญาตให้ rgrps มีเวลาพักขั้นต่ำ

หากฉันต้องการดูว่ามีแพตช์ใดบ้างในสาขาอื่น ฉันสามารถระบุสาขาอื่นได้:

$ gitlog recovery24 

2. gitlog.id

gitlog.id เพียงพิมพ์รหัส SHA1 ของแพตช์:

$ gitlog.id
----------------------[ recovery25 ]------------- ----------
56908eeb6940 2ca4a6b628a1 fc64ad5d99fe 02031a00a251 f6f38da7dd18 d8546e8f0023 fc3cc1f98f6b 12c3e0cb3523 76cce178b134 6fc1dce3ab9c 1b681ab074ca 26fed8de719b 802ff51a5670 49f67a512d8c f04f20193bbb 5f6afe809d23 2030521dc70e dada79b3be94 9b19a1e08161 78a035041d3e f03da011cae2 0d2b2e068fcd 2449976aa133 57dfb5e12ccd 53abedfdcf72 6fbdda3474b3 49544a547188 187032f7a63c 6f75dae23d93 95fc2a261b00 ebfb14ded191 f653ee9e414a 0e2911cb8111 73968b76e2e3 8a3e4cb5e92c a5f2da803b5b 7c9ef68388ed 71ca19d0cba8 340d27a33895 9b3c4e6efb10 d2e8c22be39b 9563e31f8bfd ebac7a38036c f703a3c27874 a3e86d2ef30e da3c604755b0 4525c2fab5ab5e86d2ef30e da3c604755b0 4525c2fab5ab5e

อีกครั้ง มันถือว่าสาขาปัจจุบัน แต่ฉันสามารถระบุสาขาอื่นได้หากต้องการ

3. gitlog.id2

gitlog.id2 เหมือนกับ gitlog.id แต่ไม่มีกิ่งก้านอยู่ด้านบน สิ่งนี้มีประโยชน์สำหรับการเลือกเชอร์รี่จากสาขาหนึ่งไปยังสาขาปัจจุบัน:

$ # create a new branch
$ git branch --track origin/master
$ # ลองดูสาขาใหม่ที่ฉันเพิ่งสร้างขึ้น
$ git checkout recovery26
$ # เชอร์รี่เลือกแพตช์ทั้งหมดจากสาขาเก่าไปยังอันใหม่
$ สำหรับฉันใน `gitlog.id2 recovery25`; ทำ git cherry-pick $i;done

4. gitlog.grep

gitlog.grep grep สำหรับสตริงภายในคอลเล็กชันของแพตช์นั้น ตัวอย่างเช่น หากฉันพบจุดบกพร่องและต้องการแก้ไขโปรแกรมแก้ไขที่มีการอ้างอิงถึงฟังก์ชัน inode_go_sync , ฉันแค่ทำ:

$ gitlog.grep inode_go_sync
----------------------[ recovery25 - 50 patches ]--------- --------------
(snip)
11 340d27a33895 Bob Peterson     gfs2:ระบายรายการ ail2 หลังจากข้อผิดพลาด io
10 9b3c4e6efb10 Bob Peterson     gfs2:ทำความสะอาด iopen glock ยุ่งเหยิงใน gfs2_create_inode
 9 d2e8c22be39b Bob Peterson     gfs2:ทำการตรวจสอบข้อผิดพลาดที่เหมาะสมสำหรับ go_sync family of glops
152:-static void inode_go_sync(struct gfs2_glock *gl:_+static />15 inode_go_sync (struct gfs2_glock *gl)
163:@@ -296,6 +302,7 @@ static void inode_go_sync(struct gfs2_glock *gl)
 8 9563e31f8bfd Christoph Hellwig gfs2:use page_offset_br/mkwrite
> 7 ebac7a38036c Christoph Hellwig gfs2:อย่าใช้ buffer_heads ใน gfs2_allocate_page_backing
 6 f703a3c27874 Andreas Gruenbacher gfs2:ปรับปรุงการเขียน mmap เทียบกับความสอดคล้องของ punch_hole
 f703a3c27874 Andreas Gruenbacher gfs2:ปรับปรุงหน้า mmap การเขียนเทียบกับ punch_hole ความสอดคล้อง
 ef a3e86d หลายรายการใน Andreas> 4 da3c604755b0 Andreas Gruenbacher gfs2:F ix การจัดการส่วนท้ายของไฟล์ใน gfs2_page_mkwrite
 3 4525c2f5b46f Bob Peterson     เครื่องมือวัดแผ่นพื้นของ Rafael Aquini
 2 a06a5b7dea02 Bob Peterson^     GFS2:เพิ่มฟังก์ชัน go_get_holdtime ให้กับ gl_ops_96d ที่เหลือ> gl_ops_93 / 7 ใช้ใน dq
 H e8b5ff851bb9 Bob Peterson     gfs2:อนุญาตให้ rgrps มีเวลาพักขั้นต่ำ

ตอนนี้ฉันรู้แล้วว่าแพทช์ HEAD~9 คือสิ่งที่ต้องการแก้ไข ฉันใช้ git rebase -i HEAD~10 ในการแก้ไขแพตช์ 9 git commit -a --amend จากนั้น git rebase --continue เพื่อทำการปรับเปลี่ยนที่จำเป็น

5. gitbranchcmp3

gitbranchcmp3 ให้ฉันเปรียบเทียบสาขาปัจจุบันของฉันกับสาขาอื่น เพื่อที่ฉันจะได้เปรียบเทียบแพตช์เวอร์ชันเก่ากับเวอร์ชันที่ใหม่กว่าของฉัน และดูได้อย่างรวดเร็วว่ามีอะไรเปลี่ยนแปลงและอะไรไม่ได้ มันสร้างสคริปต์เปรียบเทียบ (ที่ใช้เครื่องมือ KDE Kompare ซึ่งทำงานบน GNOME3 ด้วย) เพื่อเปรียบเทียบแพตช์ที่ไม่เหมือนกัน หากไม่มีความแตกต่างอื่นใดนอกจากหมายเลขบรรทัด จะพิมพ์ [SAME] . หากมีเพียงความคิดเห็นที่แตกต่าง จะพิมพ์ [เหมือนกัน] (ตัวพิมพ์เล็ก) ตัวอย่างเช่น:

$ gitbranchcmp3 recovery24
Branch recovery24 has 47 patches
Branch recovery25 has 50 patches

(snip)
38 87eb6901607a 340d27a33895 [same] gfs2:drain the ail2 รายการหลังจากข้อผิดพลาด io
39 90fefb577a26 9b3c4e6efb10 [เหมือนกัน] gfs2:ล้างข้อมูล iopen glock mess ใน gfs2_create_inode
40 ba3ae06b8b0e d2e8c22be39b [same] gfs2_29 ทำการตรวจสอบข้อผิดพลาดในตระกูล gfs2_29 ที่เหมาะสม 9563e31f8bfd [SAME] gfs2:ใช้ page_offset ใน gfs2_page_mkwrite
42 0adc6d817b7a ebac7a38036c [SAME] gfs2:อย่าใช้ buffer_heads ใน gfs2_allocate_page43_AME0_f1g ที่สม่ำเสมอ
เทียบกับ Impro3 เทียบกับ 8 ผลลัพธ์:8 ค่าความสอดคล้องของ Impro3
/>44 de57c2f72570 a3e86d2ef30e [SAME] gfs2:การจัดสรรหลายบล็อกใน gfs2_page_mkwrite
45 7c5305fbd68a da3c604755b0 [SAME] gfs2:แก้ไขการจัดการ end-of-file ใน gfks2_brAME_516 เครื่องมือวัด
47              a06a5b7dea02 [    ] GFS2:เพิ่ม go_get _holdtime to gl_ops
48              8ba93c796d5c [    ] gfs2:แนะนำฟังก์ชันใหม่ left_hold_time และใช้ใน dq
49              e8b5ff851bb]9 [  sgrs a อนุญาตให้ถือเวลาต่ำสุด:recovery25:
สิ่งที่ขาดหายไป:
เปรียบเทียบสคริปต์ที่สร้างที่:/tmp/compare_mismatches.sh

6. gitlog.find

ในที่สุด ฉันมี gitlog.find สคริปต์ที่ช่วยฉันระบุตำแหน่งของแพตช์อัปสตรีมของฉันและสถานะปัจจุบันของแพตช์แต่ละรายการ ทำได้โดยการจับคู่คำอธิบายโปรแกรมแก้ไข นอกจากนี้ยังสร้างสคริปต์เปรียบเทียบ (อีกครั้งโดยใช้ Kompare) เพื่อเปรียบเทียบแพตช์ปัจจุบันกับคู่อัปสตรีม:

$ gitlog.find
----------------------[ recovery25 - 50 แพตช์ ]---------- -------------
(snip)
11 340d27a33895 Bob Peterson     gfs2:ระบายรายการ ail2 หลังจากข้อผิดพลาด io
lo 5bcb9be74b2a Bob Peterson     gfs2:ระบาย ail2 รายการหลังจากข้อผิดพลาด io
10 9b3c4e6efb10 Bob Peterson     gfs2:ทำความสะอาด iopen glock mess ใน gfs2_create_inode
fn 2c47c1be51fb Bob Peterson     gfs2:ทำความสะอาด iopenc glock ยุ่งใน gfs2_cread_binin ininin การตรวจสอบข้อผิดพลาดสำหรับ go_sync family of glops
lo feb7ea639472 Bob Peterson     gfs2:ทำการตรวจสอบข้อผิดพลาดที่เหมาะสมสำหรับ go_sync family of glops
 8 9563e31f8bfd Christoph Hellwig gfs2:use page_offset in gfs2_broph>83mk fwrite:ใช้ page_offset ใน gfs2_page_mkwrite
 7 ebac7a38036c Christoph Hellwig gfs2:อย่าใช้ buffer_heads ใน gfs2_allocate_page_backing
ms 35af80aef99b Christoph Hellwig gfs2:ห้ามใช้ buffer_cate_heads ใน cking
 6 f703a3c27874 Andreas Gruenbacher gfs2:ปรับปรุงการเขียน mmap เทียบกับความสม่ำเสมอของ punch_hole
fn 39c3a948ecf6 Andreas Gruenbacher gfs2:ปรับปรุงการเขียน mmap เทียบกับความสอดคล้องของ punch_hole
 530 a3e86d2rufs ใน Andreas หลายตำแหน่ง:gfs2_page_mkwrite
fn f53056c43063 Andreas Gruenbacher gfs2:การจัดสรรหลายบล็อกใน gfs2_page_mkwrite
 4 da3c604755b0 Andreas Gruenbacher gfs2:แก้ไขการจัดการ end-of-file ใน 184_gfs2_ หน้า 184_gfs2_gfs2:- การจัดการไฟล์ใน gfs2_page_mkwrite
 3 4525c2f5b46f Bob Peterson     เครื่องมือวัดแผ่นพื้นของ Rafael Aquini
   ไม่พบต้นน้ำ
 2 a06a5b7dea02 Bob Peterson     GFS2:เพิ่ม go_getop holdtime to gl> 8ba93c796d5c Bob Peterson     gfs2:แนะนำฟังก์ชันใหม่ left_hold_time และใช้ใน dq
   Not found upstream
 H e8b5ff851bb9 Bob Peterson     gfs2:อนุญาตให้ rgrps มีเวลาพักขั้นต่ำ
   ไม่พบ stream
เปรียบเทียบสคริปต์ที่สร้าง:/tmp/compare_upstream.sh

แพตช์จะแสดงเป็นสองบรรทัด โดยบรรทัดแรกคือแพตช์ปัจจุบันของคุณ ตามด้วยแพตช์อัปสตรีมที่เกี่ยวข้อง และตัวย่อ 2 อักขระเพื่อระบุสถานะอัปสตรีม:

  • เอาสิ หมายความว่าแพตช์อยู่ใน repo ต้นทางของ Git เท่านั้น (เช่น ยังไม่ได้พุชอัปสตรีม)
  • มิลลิวินาที หมายถึงแพตช์อยู่ในมาสเตอร์แบรนช์ของ Linus Torvald
  • fn หมายความว่าแพตช์ถูกผลักไปที่สาขาการพัฒนา "for-next" ของฉัน ซึ่งมีไว้สำหรับหน้าต่างการรวมอัปสตรีมถัดไป

สคริปต์บางส่วนของฉันตั้งสมมติฐานโดยอิงจากวิธีที่ฉันทำงานกับ Git ตามปกติ ตัวอย่างเช่น เมื่อค้นหาแพตช์อัปสตรีม จะใช้ตำแหน่งของ Git tree ที่ฉันรู้จัก ดังนั้น คุณจะต้องปรับหรือปรับปรุงให้เหมาะสมกับสภาพของคุณ gitlog.find สคริปต์ออกแบบมาเพื่อระบุตำแหน่งของแพตช์ GFS2 และ DLM เท่านั้น ดังนั้นหากคุณไม่ใช่นักพัฒนา GFS2 คุณจะต้องปรับแต่งให้เข้ากับส่วนประกอบที่คุณสนใจ

ซอร์สโค้ด

นี่คือที่มาของสคริปต์เหล่านี้

1. gitlog

#!/bin/bash
branch=$1

ถ้าทดสอบ "x$branch" =x; แล้ว
    branch=`git branch -a | grep "*" | cut -d ' ' -f2`
fi

patches=0
tracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u }`

LIST=`git log --reverse --abbrev-commit --pretty=oneline $tracking..$branch | cut -d ' ' -f1 |paste -s -d ' '`
สำหรับ i ใน $LIST; ทำแพทช์=$(echo $patches + 1 | bc);done

if [[ $branch =~ .*for-next.* ]]
then
    start=HEAD
#    start=origin/for-next
else
    start=origin/master
fi

tracking=`git rev-parse --abbrev -ref --symbolic-full-name @{u}`

/usr/bin/echo "--------------------- ---[" $branch "]----------------------"
patches=$(echo $patches - 1 | bc);
สำหรับฉันใน $LIST; ทำ
    ถ้า [ $patches -eq 1 ]; แล้ว
        cnt=" ^"
    elif [ $patches -eq 0 ]; แล้ว
        cnt=" H"
   อื่น
        if [ $patches -lt 10 ]; แล้ว
            cnt=" $patches"
        else
            cnt="$patches"
        fi
    fi
    /usr/bin/git show --abbrev -commit -s --pretty=format:"$cnt %h %<|(32)%an %s %n" $i
    patches=$(echo $patches - 1 | bc)
done
#git log --reverse --abbrev-commit --pretty=format:"%h %<|(32)%an %s" $tracking..$branch
#git log - -reverse --abbrev-commit --pretty=format:"%h %<|(32)%an %s" ^origin/master ^linux-gfs2/for-next $branch

2. gitlog.id

#!/bin/bash
branch=$1

ถ้าทดสอบ "x$branch" =x; แล้ว
    branch=`git branch -a | grep "*" | cut -d ' ' -f2`
fi

tracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u}`

/usr/bin/echo "-----------------------[" $branch "]----------- ------------"
บันทึก git --reverse --abbrev-commit --pretty=oneline $tracking..$branch | cut -d ' ' -f1 |paste -s -d ' '

3. gitlog.id2

#!/bin/bash
branch=$1

ถ้าทดสอบ "x$branch" =x; แล้ว
    branch=`git branch -a | grep "*" | cut -d ' ' -f2`
fi

tracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u}`
git บันทึก --reverse --abbrev-commit --pretty=oneline $tracking..$branch | cut -d ' ' -f1 |paste -s -d ' '

4. gitlog.grep

#!/bin/bash
param1=$1
param2=$2

ถ้าทดสอบ "x$param2" =x; แล้ว
    branch=`git branch -a | grep "*" | cut -d ' ' -f2`
    string=$param1
else
    branch=$param1
    string=$param2
fi

patches=0
tracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u}`

LIST=`git log --reverse --abbrev -commit --pretty=oneline $tracking..$branch | cut -d ' ' -f1 |paste -s -d ' '`
สำหรับ i ใน $LIST; ทำแพทช์=$(echo $patches + 1 | bc);done
/usr/bin/echo "----------------------[ " $branch "-" $patches "patches ]----------------------"
patches=$(echo $patches - 1 | bc );
สำหรับฉันใน $LIST; ทำ
    ถ้า [ $patches -eq 1 ]; แล้ว
        cnt=" ^"
    elif [ $patches -eq 0 ]; แล้ว
        cnt=" H"
   อื่น
        if [ $patches -lt 10 ]; แล้ว
            cnt=" $patches"
        else
            cnt="$patches"
        fi
    fi
    /usr/bin/git show --abbrev -commit -s --pretty=format:"$cnt %h %<|(32)%an %s" $i
    /usr/bin/git show --pretty=email --patch-with- stat $i | grep -n "$string"
    patches=$(echo $patches - 1 | bc)
เสร็จสิ้น

5. gitbranchcmp3

#!/bin/bash
#
# gitbranchcmp3 []
#
oldbranch=$1
newbranch=$2
script=/tmp/compare_mismatches.sh

/usr/bin/rm -f $script
echo "#!/bin/bash"> $script
/usr /bin/chmod 755 $script
echo "# สร้างโดย gitbranchcmp3.sh">> $script
echo "# เรียกใช้สคริปต์นี้เพื่อเปรียบเทียบแพตช์ที่ไม่ตรงกัน">> $script
echo " ">> $script
echo "function comparison_them()">> $script
echo "{"  >> $script
echo "    git show --pretty=email --patch-with -stat \$1> /tmp/gronk1">> $script
echo "   git show --pretty=email --patch-with-stat \$2> /tmp/gronk2">> $script
echo "    kompare /tmp/gronk1 /tmp/gronk2">> $script
echo "}">> $script
echo " ">> $script

if test " x$newbranch" =x; แล้ว
    newbranch=`git branch -a | grep "*" | cut -d ' ' -f2`
fi

tracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u}`

ประกาศ -a oldsha1s=(`บันทึก git --reverse --abbrev-commit --pretty=oneline $tracking..$oldbranch | cut -d ' ' -f1 |paste -s -d ' '`)
ประกาศ -a newsha1s=(`บันทึก git --reverse --abbrev-commit --pretty=oneline $tracking..$newbranch | cut -d ' ' -f1 |paste -s -d ' '`)

#echo "old:​​" $oldsha1s
oldcount=${#oldsha1s[@]}
echo "สาขา $oldbranch มี $oldcount patches"
oldcount=$ (echo $oldcount - 1 | bc)
#for o ใน `seq 0 ${#oldsha1s[@]}`; ทำ
#    echo -n ${oldsha1s[$o]} " "
#    desc=`git show $i | หัว -5 | หาง -1|cut -b5-`
#done

#echo "new:" $newsha1s
newcount=${#newsha1s[@]}
echo "สาขา $newbranch มี $newcount patches"
newcount=$(echo $newcount - 1 | bc)
#for o in `seq 0 ${#newsha1s[@]}`; ทำ
#    echo -n ${newsha1s[$o]} " "
#    desc=`git show $i | หัว -5 | tail -1|cut -b5-`
#done
echo

สำหรับสิ่งใหม่ใน `seq 0 $newcount`; ทำ
    newsha=${newsha1s[$new]}
    newdesc=`git show $newsha | หัว -5 | tail -1|cut -b5-`
    oldsha="            "
    same="[    ]"
    สำหรับเก่าใน `seq 0 $oldcount`; do
        if test "${oldsha1s[$old]}" ="match"; แล้ว
            ทำต่อ;
        fi
        olddesc=`git show ${oldsha1s[$old]} | หัว -5 | tail -1|cut -b5-`
        if test "$olddesc" ="$newdesc"; แล้ว
            oldsha=${oldsha1s[$old]}
            #echo $oldsha
            git show $oldsha |tail -n +2 |grep -v "index.*\.\." |grep -v "@@"> /tmp/gronk1
            git show $newsha |tail -n +2 |grep -v "index.*\.\." |grep -v "@@"  > /tmp/gronk2
            diff /tmp/gronk1 /tmp/gronk2 &> /dev/null
            if [ $? -eq 0 ];then
# ไม่มีความแตกต่าง
                same="[SAME]"
                oldsha1s[$old]="match"
              <          fi>            git show $oldsha |sed -n '/diff/,$p' |grep -v "index.*\.\." |grep -v "@@"> /tmp/gronk1
            git show $newsha |sed -n '/diff/,$p' |grep -v "index.*\.\." |grep -v "@@"> /tmp/gronk2
            diff /tmp/gronk1 /tmp/gronk2 &> /dev/null
            if [ $? -eq 0 ];then
# ความแตกต่างในความคิดเห็นเท่านั้น
                same="[same]"
                oldsha1s[$old]="match"
            >      แตก
            oldsha1s[$old]="match"
            echo "compare_them $oldsha $newsha">> $script
        fi
    done
    echo "$new $oldsha $newsha $same $newdesc"
done

echo
echo "Missing from $newbranch:"
the_missing=""
# ตอนนี้วิ่งผ่านสิ่งเก่า ๆ ที่เรา ไม่ได้จับคู่
สำหรับเก่าใน `seq 0 $oldcount`; ทำ
    if test ${oldsha1s[$old]} !="match"; แล้ว
        olddesc=`git show ${oldsha1s[$old]} | หัว -5 | tail -1|cut -b5-`
        echo "${oldsha1s[$old]} $olddesc"
        the_missing=`echo "$the_missing ${oldsha1s[$old]}"`
    fi
done

echo "The missing:" $the_missing
echo "เปรียบเทียบสคริปต์ที่สร้างที่:$script"
#git log --reverse --abbrev -commit --pretty=oneline $tracking..$branch | cut -d ' ' -f1 |paste -s -d ' '

6. gitlog.find

#!/bin/bash
#
# ค้นหาแพตช์อัปสตรีมที่เทียบเท่า
#
# gitlog.find
#
cwd=$PWD
param1=$1
ubranch=$2
patches=0
script=/tmp/compare_upstream.sh
echo "#!/bin/bash"> $script
/usr/bin/chmod 755 $script
echo "# สร้างโดย gitbranchcmp3.sh">> $script
echo "# เรียกใช้สคริปต์นี้เพื่อเปรียบเทียบแพตช์ที่ไม่ตรงกัน">> $script
echo " ">> $script
echo "function comparison_them()">> $script
echo "{"  >> $script
echo "    cwd=$PWD">> $script
echo "    git show --pretty=email --patch-with-stat \$2> /tmp/gronk2">> $script
echo "    cd ~/linux.git/fs/gfs2 ">> $script
echo "    git show --pretty=email --patch-with-stat \$1> /tmp/gronk1">> $script
echo "    cd $cwd">> $ script
echo "    kompare /tmp/gronk1 /tmp/gronk2">> $script
echo "}">> $script
echo " ">> $script

#echo "กำลังรวบรวมข้อมูลอัปสตรีมแพตช์ โปรดรอสักครู่"
branch=`git branch -a | grep "*" | cut -d ' ' -f2`
tracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u}`

cd ~/linux.git
ถ้าทดสอบ "X${ubranch}" ="X"; แล้ว
    ubranch=`git branch -a | grep "*" | cut -d ' ' -f2`
fi
utracking=`git rev-parse --abbrev-ref --symbolic-full-name @{u}`
#
# รวบรวมรายชื่อแพทช์ gfs2 จากมาสเตอร์ เผื่อหาไม่เจอ
#
#git log --abbrev-commit --pretty=format:"   %h %<|(32) %an %s" master |grep -i -e "gfs2" -e "dlm"> /tmp/gronk
git log --reverse --abbrev-commit --pretty=format:"ms %h % <|(32)%an %s" master fs/gfs2/> /tmp/gronk.gfs2
# ms =ในตัวหลักของ Linus
git log --reverse --abbrev-commit --pretty=รูปแบบ:"ms %h %<|(32)%an %s" master fs/dlm/> /tmp/gronk.dlm

cd $cwd
LIST=`git log - -reverse --abbrev-commit --pretty=oneline $tracking..$branch | cut -d ' ' -f1 |paste -s -d ' '`
สำหรับ i ใน $LIST; ทำแพทช์=$(echo $patches + 1 | bc);done
/usr/bin/echo "----------------------[ " $branch "-" $patches "patches ]----------------------"
patches=$(echo $patches - 1 | bc );
สำหรับฉันใน $LIST; ทำ
    ถ้า [ $patches -eq 1 ]; แล้ว
        cnt=" ^"
    elif [ $patches -eq 0 ]; แล้ว
        cnt=" H"
   อื่น
        if [ $patches -lt 10 ]; แล้ว
            cnt=" $patches"
        else
            cnt="$patches"
        fi
    fi
    /usr/bin/git show --abbrev -commit -s --pretty=format:"$cnt %h %<|(32)%an %s" $i
    desc=`/usr/bin/git show --abbrev-commit -s - -pretty=format:"%s" $i`
    cd ~/linux.git
    cmp=1
    up_eq=`git log --reverse --abbrev-commit --pretty=format:"lo %h %<|(32)%an %s" $utracking..$ubranch | grep "$desc"`
# lo =in local for-next
    if test "X$up_eq" ="X"; แล้ว
        up_eq=`git log --reverse --abbrev-commit --pretty=format:"fn %h %<|(32)%an %s" master..$utracking | grep "$desc"`
# fn =in for-next สำหรับหน้าต่างการรวมถัดไป
        if test "X$up_eq" ="X"; แล้ว
            up_eq=`grep "$desc" /tmp/gronk.gfs2`
            ถ้าทดสอบ "X$up_eq" ="X"; แล้ว
                up_eq=`grep "$desc" /tmp/gronk.dlm`
                ถ้าทดสอบ "X$up_eq" ="X"; แล้ว
                    up_eq="   ไม่พบต้นน้ำ"
                    cmp=0
                fi
 <      / $ echo />    ถ้า [ $cmp -eq 1 ]; แล้ว
        UP_SHA1=`echo $up_eq|cut -d' ' -f2`
        echo "compare_them $UP_SHA1 $i">> $script
    fi
    cd $cwd
    patches=$(echo $patches - 1 | bc)
done
echo "เปรียบเทียบสคริปต์ที่สร้าง:$script"