hiển thị tất cả các thẻ trong nhật ký git


98

Tại sao git log --decoratekhông hiển thị nhiều hơn một thẻ cho mỗi cam kết?

CHỈNH SỬA : Charles Bailey đã đưa ra câu trả lời (ít nhất là trong trường hợp của tôi)
Về cơ bản, tôi có một thẻ trỏ đến một thẻ khác trỏ đến cam kết. Do có thêm lớp hướng dẫn này, thẻ đã không hiển thị trong nhật ký. Tôi sẽ phải sửa lỗi này, bằng cách sửa tập lệnh gắn thẻ của chúng tôi để gắn thẻ chính xác hoặc bằng một số voodoo tập lệnh shell để theo dõi đệ quy các thẻ. Dù sao, tôi sẽ để lại câu hỏi này chỉ để tham khảo trong trường hợp có ai muốn nó. (Tôi mới sử dụng lỗi tràn ngăn xếp, nhưng tôi cho rằng đó là giao thức chính xác?)

... Câu hỏi gốc sau ...

Thông tin cơ bản: Chúng tôi sử dụng GIT tại nơi làm việc để kiểm soát nguồn và chúng tôi có chính sách luôn gắn thẻ cam kết khi chúng tôi triển khai. (Nó thực sự là một tập lệnh thực hiện các thẻ, và sau đó kéo thẻ trên máy chủ). Vì đó là một ứng dụng web với các máy chủ dàn dựng và sản xuất riêng biệt, chúng tôi thường gắn thẻ một bản phát hành cho việc dàn dựng (để thử nghiệm hoặc bất cứ thứ gì), sau đó gắn thẻ cùng một cam kết cho sản xuất.

Vì vậy, thực sự rất thường xuyên mà chúng tôi có nhiều thẻ trên cùng một cam kết. Sẽ rất tuyệt nếu có thể thấy điều này trong nhật ký văn bản, nhưng có vẻ như nó không hỗ trợ. Tôi hiện đang giải quyết vấn đề bằng cách kiểm tra thủ công thẻ mà tôi đang tìm kiếm hoặc bằng cách kích hoạt gitk. Mặc dù cả hai giải pháp này đều hoạt động, nhưng đối với tôi, có vẻ như thật kỳ lạ git log --decoratekhi chỉ hỗ trợ một thẻ cho mỗi cam kết theo mặc định.

Tôi đã tìm kiếm xung quanh, nhưng không tìm thấy nhiều. Tôi có thiếu một cái gì đó rõ ràng không?

PS (Tôi thực sự sử dụng một chuỗi định dạng tùy chỉnh %d, theo các trang người đàn ông và một số thử nghiệm nhanh, nó tương đương với --decorate)


12
Bạn đã thử 'git log --dec decor = full' (trừ dấu ngoặc kép) chưa?
RDL

1
Bạn đang sử dụng phiên bản git nào? Tôi thấy nhiều thẻ tốt trong của tôi.
Cascabel

@RDL: full thì nó in refs / heads / hoặc refs / tags / sao cho phù hợp, đúng không? Không nhiều hơn hoặc ít hơn refs.
Cascabel

9
Câu hỏi nhanh, bạn gắn thẻ các thẻ hay bạn gắn thẻ cam kết? (Thẻ có thể hình thành chuỗi, trong các thử nghiệm của tôi trang trí nhìn thẻ trỏ đến một cam kết và các thẻ trỏ đến một thẻ vào một cam kết nhưng chọn nào tốt hơn đó.)
CB Bailey

1
@Charles Bailey Tôi nghĩ bạn có thể đã xác định được vấn đề. Tôi đã thử một bài kiểm tra đơn giản tại nơi làm việc (git phiên bản 1.6.3.3) và có vẻ như nó hoạt động tốt. Vì vậy, nó không phải là một vấn đề về phiên bản. Tôi sẽ điều tra thêm sau. Cảm ơn cho cái nhìn sâu sắc!
Jonathan

Câu trả lời:


17

Lưu ý về thẻ tag (gắn thẻ tag), đây là nguồn gốc của vấn đề của bạn, như Charles Bailey đã chỉ ra một cách chính xác trong nhận xét:

Đảm bảo bạn nghiên cứu chuỗi này , vì việc ghi đè thẻ đã ký không dễ dàng:

  • nếu bạn đã đẩy một thẻ, git tagtrang người đàn ông nghiêm túc khuyên bạn không nên đơn giản git tag -f Bthay thế một tên thẻ " A"
  • không cố gắng tạo lại thẻ đã ký với git tag -f(xem trích xuất chuỗi bên dưới)

    (nó là về một trường hợp góc, nhưng khá hướng dẫn về thẻ nói chung và nó đến từ một cộng tác viên SO khác Jakub Narębski ):

Xin lưu ý rằng tên của thẻ (thẻ nặng, tức là đối tượng thẻ) được lưu trữ ở hai nơi:

  • trong bản thân đối tượng thẻ dưới dạng nội dung của tiêu đề 'thẻ' (bạn có thể thấy nó ở đầu ra của " git show <tag>" và cả ở đầu ra của " git cat-file -p <tag>", ở đây <tag>là thẻ nặng, ví dụ như v1.6.3trong git.gitkho lưu trữ),
  • và cũng là tên mặc định của tham chiếu thẻ (tham chiếu trong refs/tags/*không gian tên "") trỏ đến một đối tượng thẻ.
    Lưu ý rằng tham chiếu thẻ ( tham chiếu thích hợp trong refs/tags/*không gian tên "" hoàn toàn là vấn đề cục bộ ; ví dụ như một kho lưu trữ có trong ' refs/tags/v0.1.3', kho khác có thể có trong ' refs/tags/sub/v0.1.3'.

Vì vậy, khi bạn tạo thẻ đã ký ' A', bạn có tình huống sau (giả sử rằng nó chỉ vào một số cam kết)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

Cũng xin lưu ý rằng " git tag -f A A" ( lưu ý rằng không có tùy chọn buộc nó phải là một thẻ được chú thích) là một lỗi - nó không thay đổi tình hình.

Nếu bạn làm " git tag -f -s A A": lưu ý rằng bạn ép owerwriting một thẻ (để git giả định rằng bạn biết những gì bạn đang làm), và đó là một trong những -s/ -a/ -mtùy chọn được sử dụng để buộc tag chú thích (tạo ra các đối tượng thẻ), bạn sẽ nhận được tình huống sau

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

Cũng lưu ý rằng " git show A" sẽ hiển thị toàn bộ chuỗi cho đối tượng không gắn thẻ ...


86
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

Phiên bản này cũng sẽ in thông báo cam kết:

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.

2
Tốt hơn nữa là tạo bí danh cho nó :) git config --global alias.tags "! Git log --no-walk --tags --pretty = '% h% d% s' --dec decor = full"
GOXR3PLUS

1
Cảm ơn @ GOXR3PLUS. Tôi phải làm: git config --global alias.tags "đăng nhập --no-đi --tags --pretty = '% h% d% s' --decorate = đầy đủ"
ajh158

8

Lưu ý: cam kết 5e1361c từ brian m. carlson ( bk2204) (cho git 1.9 / 2.0 Q1 2014) giải quyết một trường hợp đặc biệt về trang trí nhật ký với các thẻ:

nhật ký: xử lý đúng cách các đồ trang trí với các thẻ chuỗi

git logđã không xử lý chính xác các trang trí khi một đối tượng thẻ tham chiếu đến một đối tượng thẻ khác không còn là một tham chiếu, chẳng hạn như khi thẻ thứ hai bị xóa .
Cam kết sẽ không được trang trí chính xác bởi vìparse_object chưa được gọi trên thẻ thứ hai và do đó trường được gắn thẻ của nó chưa được điền vào, dẫn đến không có thẻ nào được liên kết với cam kết có liên quan.

Gọi parse_objectđiền vào trường này nếu nó không có để chuỗi thẻ có thể được tham chiếu và cam kết có thể được trang trí đúng cách.
Bao gồm các bài kiểm tra cũng như để ngăn chặn sự thụt lùi trong tương lai.

Thí dụ:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full
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.