ค้นหาผู้สร้างสาขา Git


159

ฉันต้องการค้นหาผู้ที่สร้างสาขา

ฉันสามารถทำได้ด้วย:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

อย่างไรก็ตามสิ่งนี้จะคืนค่าผู้ส่งครั้งสุดท้ายต่อสาขาไม่จำเป็นต้องเป็นคนที่สร้างสาขา


7
คุณไม่สามารถรับผู้แต่งสาขา / ผู้สร้างได้ในคอมไพล์ สิ่งที่คุณทำที่นี่คือรับผู้เขียนเคล็ดลับของสาขา มันจะเปลี่ยนทันทีที่มีคนกดคอมมิทใหม่
sylvain.joyeux

1
คำเตือน: ข้อสันนิษฐานโดยนัยในคำถาม / คำตอบนี้คือ "ในขั้นตอนการทำงานที่มีเพียงหนึ่งคนต่อสาขา " ในเวิร์กโฟลว์อื่นที่เพื่อนร่วมงานอย่างน้อยสองคนแบ่งปันสาขาข้อมูลนี้ (ผู้สร้างสาขา) ไม่สามารถหาได้ผ่านทางคอมไพล์และคำตอบข้างต้นอาจนำใครบางคนเข้าสู่สมมติฐานที่ผิดพลาด
RomainValeri

คำตอบ:


56

สาขาคืออะไรนอกจากตัวชี้การกระทำ เช่นนี้จะไม่ติดตามข้อมูลเมตาเช่น "ใครเป็นคนสร้างฉัน" ดูด้วยตัวคุณเอง ลองcat .git/refs/heads/<branch>ในพื้นที่เก็บข้อมูลของคุณ

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

นอกจากนี้คำตอบของ DarVar ด้านล่างเป็นวิธีที่ชาญฉลาดในการรับข้อมูลนี้


สำหรับฉันนี้อยู่ใน .git / refs / หัว / <สาขา> "อ้าง" เป็นพหูพจน์
เจฟฟรีย์ Lecours

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

296

รายชื่อสาขา Git ระยะไกลตามผู้แต่งเรียงตามวันที่เดินทาง:

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate

8
เป็นคนสุดท้ายที่จะผูกพันกับสาขานั้น เนื่องจากสาขาเป็นเพียงตัวชี้ไปยังกระทำ
DarVar

7
ควรใช้กับ Windows ได้หรือไม่ ฉันได้รับ "ระบุไฟล์อินพุตสองครั้ง"
Steve Chambers

27
ด้วยการจัดรูปแบบตาราง: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(ได้แนวคิดจากstackoverflow.com/a/3631819 - อาจจำเป็นต้องปรับตัวเลขใน awk printf ขึ้นอยู่กับความยาวสูงสุด datetime / ผู้เขียนชื่อยาว)
Gary S. Weaver

15
ในกรณีที่ยังไม่มีการกระทำใด ๆ ในสาขาและถ้ามันถูกสร้างขึ้นจากต้นแบบ "ผู้เขียนของสาขา" จะไม่เกี่ยวข้องกับสาขานั้นอย่างสมบูรณ์ แต่เป็นเพียงผู้ส่งสุดท้ายในต้นแบบ หากคุณดึงการเปลี่ยนแปลงจากต้นแบบและเป็นไปข้างหน้าอย่างรวดเร็วมันเป็นอีกครั้งที่ผู้เดินทางคนสุดท้ายบนต้นแบบที่อาจไม่เคยทำงานในสาขานั้น
กุสตาฟ

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

46

ฉันปรับแต่งคำตอบก่อนหน้านี้โดยใช้--sortแฟล็กและเพิ่มสี / การจัดรูปแบบ:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes

1
เหมาะสำหรับการตำหนิในสี
suarsenegger


8

การเพิ่มคำตอบของ DarVar :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PS: เราใช้ AWK เพื่อพิมพ์ผู้แต่งและสาขาระยะไกล


3
ใช้งานได้ก็ต่อเมื่อชื่อผู้แต่งเป็นคำเดียว หากแยกออกเป็นชื่อและนามสกุลคุณจะเห็นนามสกุลแทนชื่อสาขา ...
Legato

5

คุณสามารถหาที่สร้างสาขาในของคุณท้องถิ่นพื้นที่เก็บข้อมูลโดย

git reflog --format=full

ตัวอย่างผลลัพธ์:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

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

ข้อมูลจะถูกเก็บไว้ที่ ./.git/logs/refs/heads/ สาขา ตัวอย่างเนื้อหา:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

การกระทำครั้งสุดท้ายในตัวอย่างนี้มาจากผู้ใช้ "b" ในขณะที่สาขา "b2" ถูกสร้างขึ้นโดยผู้ใช้ "a" หากคุณเปลี่ยนชื่อผู้ใช้ของคุณคุณสามารถตรวจสอบว่าการอ้างอิง git นำข้อมูลจากบันทึกและไม่ได้ใช้ผู้ใช้ท้องถิ่น

ฉันไม่รู้เกี่ยวกับความเป็นไปได้ที่จะส่งข้อมูลบันทึกท้องถิ่นนั้นไปยังที่เก็บส่วนกลาง


4

เราสามารถหาคำตอบได้จากชื่อบัญชีอัตโนมัติ

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC


0

ฉันรู้ว่านี่ไม่ใช่ขอบเขตของคำถามทั้งหมด แต่หากคุณพบว่าจำเป็นต้องกรองเฉพาะการกระทำโดยผู้เขียนเฉพาะคุณสามารถไปที่ grep :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

การเข้ารหัสที่มีความสุข! :)


0

สำหรับผู้ที่กำลังมองหา DESC ... ดูเหมือนว่าจะใช้ได้ --sort=-

สำหรับการจัดรูปแบบใหม่สำหรับ ... ดวงตาของฉันกำลังสูญเสียบางส่วนของแดงก่ำ

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

อ้างอิงเพิ่มเติม: https://stackoverflow.com/a/5188364/10643471


-1

เท่าที่ฉันรู้คุณอาจเห็นว่าคุณเป็นผู้สร้างสาขาเท่านั้น สิ่งนี้จะถูกระบุโดยแถวแรกใน. git / ref / heads / <branch> หากลงท้ายด้วย "สร้างจากหัว" คุณเป็นผู้สร้าง

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