2013-06-29 22 views
8

git log --decorate thêm thông tin về refs liên quan đến các dữ liệu ghi nhận:Làm cách nào để trang trí một bản ghi git bằng thẻ gần nhất?

commit 9e895ace5d82df8929b16f58e9f515f6d54ab82d (tag: v3.10-rc7) 
Author: Linus Torvalds <[email protected]> 
Date: Sat Jun 22 09:47:31 2013 -1000 

    Linux 3.10-rc7 

Thông tin này giúp theo dõi mà thẻ (hoặc chi nhánh) chứa này cam kết. Khi xem tập hợp các tệp bị hạn chế (ví dụ: thư mục con), không cần phải là thẻ cho các cam kết đó. Có cách nào để đặt tham chiếu đến thẻ trong đầu ra nhật ký không?

Tôi đã đề cập trước đây git describe, nhưng điều đó mang lại v3.10-rc7-135-g98b6ed0 liên quan đến thẻ của chi nhánh nơi thay đổi này được thực hiện. Những gì tôi đang tìm kiếm là một tên thẻ giữa các cam kết.

Để rõ ràng, đây là tình hình hiện nay:

$ git log --decorate --oneline 
98b6ed0 (HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 
1a506e4 Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux 
578a131 dlci: validate the net device in dlci_del() 
11eb264 dlci: acquire rtnl_lock before calling __dev_get_by_name() 
... 
9e895ac (tag: v3.10-rc7) Linux 3.10-rc7 

Những gì tôi muốn có một cái gì đó như:

98b6ed0 (v3.10-rc7+, HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 
1a506e4 (v3.10-rc7+) Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux 
578a131 (v3.10-rc7+) dlci: validate the net device in dlci_del() 
11eb264 (v3.10-rc7+) dlci: acquire rtnl_lock before calling __dev_get_by_name() 
... 
9e895ac (tag: v3.10-rc7) Linux 3.10-rc7 

Sử dụng git describe 's đầu ra thay vì băm cam kết sẽ hiển thị một cái gì đó như :

$ git log --decorate --oneline -n4 | awk '{system("git describe " $1 " |tr -d '\''\n'\''");$1="";print}' 
v3.10-rc7-135-g98b6ed0 (HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 
v3.10-rc7-54-g1a506e4 Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux 
v3.10-rc6-81-g578a131 dlci: validate the net device in dlci_del() 
v3.10-rc6-80-g11eb264 dlci: acquire rtnl_lock before calling __dev_get_by_name() 
... 
v3.10-rc7 (tag: v3.10-rc7) Linux 3.10-rc7 

Như bạn có thể thấy, tên thẻ cũ hơn được sử dụng làm trọng tài nce điểm thay vì điểm mà cam kết đã được sáp nhập. Vì mục đích minh họa, tôi đang sử dụng git log --oneline tại đây, nhưng tôi thực sự muốn sử dụng đầu ra đầy đủ hơn, ví dụ: git log -p --stat.

Trả lời

5

Thông số --first-parent của git describe (được giới thiệu với git 1.8.4) cho biết vị trí cam kết là bắt nguồn từ.Để xem mối quan hệ với thẻ đầu tiên sau cam kết, hãy sử dụng git describe --contains. Tùy chọn này sẽ rất chậm (~ 6 giây) khi bạn nghiên cứu kỹ hơn trong lịch sử. Có sẵn từ git 1.5.3.

Lệnh git name-rev có thể được sử dụng để chú thích git rev-name và các công trình với --graph--color quá! Từ trang hướng dẫn sử dụng:

Được cam kết, tìm hiểu xem nó có liên quan đến nguồn gốc địa phương ở đâu. Nói ai đó đã viết cho bạn về cam kết tuyệt vời đó 33db5f4d9027a10e477ccf054b2c1ab94f74c85a. Tất nhiên, bạn nhìn vào cam kết, nhưng điều đó chỉ cho bạn biết những gì đã xảy ra, nhưng không phải là bối cảnh.

Nhập git name-rev:

% git name-rev 33db5f4d9027a10e477ccf054b2c1ab94f74c85a 
33db5f4d9027a10e477ccf054b2c1ab94f74c85a tags/v0.99~940 

Bây giờ bạn đã khôn ngoan hơn, bởi vì bạn biết rằng nó đã xảy ra 940 phiên bản trước v0.99.

Một điều tốt đẹp bạn có thể làm là:

% git log | git name-rev --stdin 

lệnh cuối cùng này gắn thêm cái gì đó để mỗi 40 ký tự băm SHA-1 như hình dưới đây (phần được đánh dấu được thêm vào bởi git name-rev).

 
commit 1ee2dcc2245340cf4ac94b99c4d00efbeba61824 (tags/v3.13-rc1~33) 
Merge: 4457e6f 091e066 
Author: Linus Torvalds 

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 

commit b4089d6d8e71a7293e2192025dfa507a04f661c4 (tags/v3.13-rc1~7^2~6^2^2~8) 
Author: Felix Fietkau 

    rt2x00: fix a crash bug in the HT descriptor handling fix 
... 
commit dfb6b7c109a7f98d324a759599d1b4616f02c79f (tags/v3.12-rc7~20^2~20^2^2~11) 
Author: Stanislaw Gruszka 
Date: Mon Sep 23 04:08:13 2013 +0200 

    Revert "rt2x00pci: Use PCI MSIs whenever possible" 

    This reverts commit 9483f40d8d01918b399b4e24d0c1111db0afffeb (tags/v3.11-rc1~16^2~103^2^2~111). 

Một kịch bản awk cho post-processing git log sản lượng hiện có sẵn tại https://git.lekensteyn.nl/scripts/tree/git-log-describe.awk (bằng văn bản trước khi tôi biết của git rev-name). Các tính năng:

  • Xem xét các hash từ commit <hash> thay vì băm 40 ký tự (chỉ hoạt động với --abbrev-commit quá).
  • Hỗ trợ định dạng git log --graph.
  • Thêm git describe --contains hoặc git describe --first-parent đầu ra.
  • Khả năng chỉ định thư mục bộ nhớ cache để tiết kiệm thời gian sau đó.
+0

Âm thanh tuyệt vời, chính xác hơn câu trả lời ban đầu của tôi. +1 – VonC

2

Như bạn có thể thấy, tên thẻ cũ hơn được sử dụng làm điểm tham chiếu thay vì điểm mà cam kết đã được hợp nhất.

Điều đó sẽ có thể ... sớm (git 1.8.4 tháng 7 năm 2013):

Xem commit e00dd1e9485c50f202cc97dfae19d510e108b565:

describe: Add --first-parent option 

Chỉ xem xét phụ huynh đầu tiên cam kết khi đi bộ lịch sử phạm .
Điều này rất hữu ích nếu bạn chỉ muốn khớp các thẻ trên chi nhánh của mình sau khi hợp nhất.


Các OP Lekensteyn comments nó (--first-parent) là không đủ:

--first-parent không hiển thị các thẻ nơi nó bị sáp nhập quá.
Tôi vừa phát hiện ra rằng --contains có thể được sử dụng cho điều đó.
Xem my answer để có giải pháp tốt hơn, git name-rev.

Lưu ý: git name-rev ngày trở về từ git0.99.9 (Oct. 2005!).

+0

Lưu ý: Tôi vừa thử nghiệm nó với "phiên bản mới nhất 1.8.3.msysgit.0'" (phiên bản mới nhất): nó vẫn hoạt động và hiển thị thẻ. – VonC

+0

Tôi đang sử dụng git 1.8.3.1. Có các thẻ thực sự cho các cam kết được gắn thẻ, nhưng các cam kết khác không có thông tin như vậy. – Lekensteyn

+0

@Lekensteyn để câu hỏi của bạn không phải là về sự vắng mặt của thẻ cho một thư mục, nhưng làm thế nào để có được một thẻ cho * bất kỳ * cam kết mà không có một (như trong 'git mô tả'). Hiểu rồi. – VonC

Các vấn đề liên quan