Tìm hiểu một người tạo chi nhánh Git


158

Tôi muốn tìm ra người đã tạo ra một chi nhánh.

Tôi có thể làm như vậy với:

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

Tuy nhiên, điều này trả về committer cuối cùng cho mỗi chi nhánh, không nhất thiết là người tạo ra chi nhánh.


7
Bạn không thể có được một tác giả / người tạo chi nhánh trong git. Những gì bạn đang làm ở đây là có được tác giả của chi nhánh. Nó sẽ thay đổi ngay khi ai đó đưa ra một cam kết mới ở đó.
sylvain.joyeux

1
Tuyên bố miễn trừ trách nhiệm: Giả định ngầm định trong câu hỏi / câu trả lời này là "trong quy trình làm việc chỉ có một người trên mỗi chi nhánh ". Trong các quy trình công việc khác có ít nhất hai đồng nghiệp chia sẻ một chi nhánh, thông tin này (người tạo chi nhánh) không thể có được thông qua git và các câu trả lời ở trên có thể dẫn ai đó vào các giả định sai.
RomainValeri

Câu trả lời:


56

Một nhánh không có gì ngoài một con trỏ cam kết. Như vậy, nó không theo dõi siêu dữ liệu như "người tạo ra tôi". Xem cho chính mình. Hãy thử cat .git/refs/heads/<branch>trong kho lưu trữ của bạn.

Điều đó được viết, nếu bạn thực sự theo dõi thông tin này trong kho lưu trữ của bạn, hãy xem mô tả chi nhánh. Chúng cho phép bạn đính kèm siêu dữ liệu tùy ý vào các nhánh, ít nhất là cục bộ.

Ngoài ra câu trả lời của DarVar dưới đây là một cách rất thông minh để có được thông tin này.


Đối với tôi, đây là .git / refs /
Heads

4
Câu trả lời của DarVar, trong khi có lẽ hữu ích với một số người, không phải là một câu trả lời chính xác. Nó chỉ đơn giản là một cách ngắn gọn hơn để làm những gì mà tác giả của câu hỏi ban đầu đã làm (cụ thể là lấy tên của người giao dịch cuối cùng cho một chi nhánh).
peabody

295

Liệt kê các nhánh Git từ xa theo tác giả được sắp xếp theo ngày committer:

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

8
Đó là người cuối cùng cam kết với chi nhánh đó. Vì một nhánh chỉ là một con trỏ đến một cam kết.
DarVar

7
Điều này có nên hoạt động trên Windows? Tôi nhận được "Tệp đầu vào được chỉ định hai lần."
Steve Chambers

27
Với định dạng bảng: 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 }'(lấy ý tưởng từ stackoverflow.com/a/3631819 - có thể cần điều chỉnh số trong bản in awk tùy thuộc vào độ dài thời gian tối đa / tên tác giả)
Gary S. Weaver

15
Trong trường hợp không có bất kỳ cam kết nào trên nhánh và nếu nó được tạo từ master, "tác giả của nhánh" hoàn toàn không liên quan đến nhánh đó mà chỉ là committer cuối cùng trên master. Nếu bạn nhận được các thay đổi từ chủ và đó là một chuyển tiếp nhanh, thì đó lại là người chuyển đổi cuối cùng trên chủ, người có thể không bao giờ làm việc trên chi nhánh đó.
Gustave

9
Mặc dù câu trả lời và mệnh lệnh này có khả năng hữu ích, tôi cảm thấy đó là một câu trả lời sai cho câu hỏi. Danh sách này liệt kê tên tác giả trên tất cả các chi nhánh là người giao dịch cuối cùng trên một chi nhánh. Có một số trường hợp theo đó thực sự sẽ không phải là người tạo ra chi nhánh. Câu trả lời thực sự là git đơn giản là không lưu trữ thông tin này.
peabody

46

Tôi đã điều chỉnh các câu trả lời trước bằng cách sử dụng --sortcờ và thêm một số màu / định dạng:

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
hoàn hảo để đổ lỗi cho màu sắc
suarsalanger


8

Thêm vào câu trả lời của DarVar :

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

PS: Chúng tôi đã sử dụng AWK để in đẹp cho tác giả và chi nhánh từ xa.


3
chỉ hoạt động nếu tên tác giả là một từ duy nhất. Nếu tên và họ được phân tách, thì bạn sẽ thấy tên cuối cùng thay vì tên chi nhánh ...
Legato

5

Bạn có thể tìm ra ai đã tạo một nhánh trong kho lưu trữ cục bộ của mình bằng cách

git reflog --format=full

Ví dụ đầu ra:

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

Nhưng điều này có lẽ là vô ích vì thông thường trên kho lưu trữ cục bộ của bạn chỉ có bạn tạo các nhánh.

Thông tin được lưu trữ tại ./.git/logs/refs/heads/ chi nhánh . Nội dung ví dụ:

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

Cam kết cuối cùng trong ví dụ này là từ người dùng "b" trong khi nhánh "b2" được tạo bởi người dùng "a". Nếu bạn thay đổi tên người dùng, bạn có thể xác minh rằng git reflog lấy thông tin từ nhật ký và không sử dụng người dùng cục bộ.

Tôi không biết về bất kỳ khả năng nào để truyền thông tin nhật ký cục bộ đó vào kho lưu trữ trung tâm.


4

Chúng ta có thể tìm hiểu dựa trên authorname

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

1

Giả định:

  1. chi nhánh được làm từ master
  2. chưa được sáp nhập vào masterchưa

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1

0

Tôi biết đây không hoàn toàn là phạm vi của câu hỏi, nhưng nếu bạn thấy chỉ cần lọc theo cam kết của một tác giả cụ thể, bạn luôn có thể chuyển sang 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'

hạnh phúc mã hóa! :)


0

Đối với những người tìm kiếm một DESC ... điều này dường như hoạt động --sort=-

ty cho định dạng, mới này ... mắt tôi đang mất một chút máu

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

tham khảo thêm: https://stackoverflow.com/a/5188364/10643471


-1

Theo tôi biết, bạn có thể thấy nếu bạn là người tạo ra một chi nhánh duy nhất. Điều này được chỉ định bởi hàng đầu tiên trong .git / ref / Heads / <Branch>. Nếu kết thúc bằng "Tạo từ CHÍNH", bạn là người tạo.

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.