Git rev-parse làm gì?


282

Không gì git rev-parselàm gì?

Tôi đã đọc trang người đàn ông nhưng nó đưa ra nhiều câu hỏi hơn câu trả lời. Những thứ như:

Chọn ra và massage thông số

Massage ? Điều đó nghĩa là gì?

Tôi đang sử dụng làm trình phân giải (tới SHA1) của các chỉ định sửa đổi, như

git rev-parse HEAD^

hoặc là

git rev-parse origin/master

Đây có phải là mục đích của lệnh? Nếu không, thậm chí là chính xác để sử dụng nó để đạt được điều này?


3
Theo như tôi có thể thấy trong trang man, đây là một tiện ích nội bộ chủ yếu để phân tích tên sửa đổi / đối tượng cho các lệnh khác. Những gì bạn đang làm là khá nhiều mục đích của rev-parselệnh. Bạn cũng có thể sử dụng nó để bình thường hóa một dòng lệnh, để chương trình thực tế không phải hiểu cú pháp tên đối tượng phức tạp của Git (bạn sẽ sử dụng git rev-parseđể thay đổi hoặc "xoa bóp", một số tham số nhất định trong dòng lệnh trước chương trình thực tế được gọi là).


60
Các trang người đàn ông cho git rev-parselà buồn cười không thể hiểu được. Tôi ngạc nhiên không ai bận tâm để viết lại biệt ngữ đó thành thứ gì đó con người có thể đọc được, thậm chí sau 5 năm.
not2qubit

@ not2qubit Tôi: 'Cảm ơn bạn đã làm rõ, tôi đã cảm thấy thấp kém.' Linus Torvalds: 'Tôi đọc lại nó, chính xác phần nào bạn không hiểu?'
Brain2000

Câu trả lời:


245

git rev-parselà một plumbinglệnh phụ trợ chủ yếu được sử dụng để thao tác.

Một cách sử dụng phổ biến git rev-parselà in băm SHA1 với một chỉ định sửa đổi. Ngoài ra, nó có nhiều tùy chọn khác nhau để định dạng đầu ra này, chẳng hạn như --shortđể in một SHA1 duy nhất ngắn hơn.

Ngoài ra còn có các trường hợp sử dụng khác (trong tập lệnh và các công cụ khác được xây dựng trên đỉnh git) mà tôi đã sử dụng cho:

  • --verify để xác minh rằng đối tượng đã chỉ định là một đối tượng git hợp lệ.
  • --git-dirđể hiển thị đường dẫn abs / tương đối của .gitthư mục.
  • Kiểm tra xem bạn hiện đang ở trong kho lưu trữ bằng cách sử dụng --is-inside-git-dirhoặc trong cây công việc bằng cách sử dụng--is-inside-work-tree
  • Kiểm tra xem repo có sử dụng không --is-bare-repository
  • In băm SHA1 của nhánh ( --branches), thẻ ( --tags) và ref cũng có thể được lọc dựa trên điều khiển từ xa (sử dụng --remote)
  • --parse-optđể chuẩn hóa các đối số trong một tập lệnh (loại tương tự getopt) và in một chuỗi đầu ra có thể được sử dụng vớieval

Massagechỉ ngụ ý rằng có thể chuyển đổi thông tin từ dạng này sang dạng khác tức là lệnh chuyển đổi. Đây là một số ví dụ nhanh tôi có thể nghĩ ra:

  • một nhánh hoặc tên thẻ vào SHA1 của cam kết mà nó đang trỏ tới để nó có thể được chuyển đến lệnh hệ thống ống nước chỉ chấp nhận các giá trị SHA1 cho cam kết.
  • một phạm vi sửa đổi A..Bcho git loghoặc git diffvào các đối số tương đương cho lệnh hệ thống ống nước cơ bản nhưB ^A

102

Chỉ để giải thích từ nguyên của tên lệnh rev-parse, Git luôn sử dụng thuật ngữ revtrong các lệnh hệ thống ống nước là viết tắt của "sửa đổi" và thường có nghĩa là hàm băm SHA1 40 ký tự cho một cam kết. rev-listVí dụ, lệnh in một danh sách băm cam kết 40 char cho một nhánh hoặc bất cứ điều gì.

Trong trường hợp này, tên có thể được mở rộng thành parse-a-commitish-to-a-full-SHA1-hash. Mặc dù lệnh có một số chức năng phụ trợ được đề cập trong câu trả lời của Tuxdude, nhưng tên của nó dường như là trường hợp sử dụng để chuyển đổi một tham chiếu thân thiện với người dùng như tên nhánh hoặc hàm băm viết tắt thành hàm băm SHA1 40 ký tự rõ ràng hữu ích nhất cho nhiều chương trình / hệ thống ống nước mục đích.

Tôi biết rằng tôi đã nghĩ rằng đó là "phân tích ngược" một cái gì đó khá lâu trước khi tôi phát hiện ra nó và gặp rắc rối tương tự với các thuật ngữ "mát xa" và "thao túng" :)

Dù sao, tôi thấy khái niệm "phân tích cú pháp" này là một cách thỏa mãn để nghĩ về nó, và một khái niệm đáng tin cậy để đưa lệnh này vào tâm trí khi tôi cần thứ đó. Thường xuyên trong kịch bản Git, bạn lấy tham chiếu cam kết thân thiện với người dùng làm đầu vào của người dùng và thường muốn giải quyết nó thành một tham chiếu làm việc xác thực và rõ ràng ngay sau khi nhận được càng tốt. Mặt khác, dịch thuật và xác nhận đầu vào có xu hướng sinh sôi nảy nở thông qua tập lệnh.


9
Cảm ơn đã giải thích, tôi đã không hiểu git-docs một chút: git-scm.com/docs/git-rev-parse
Jacob McKay

bạn có thể cho chúng tôi một ví dụ về messagingmanipulationnhư bạn đã ám chỉ trước đây?
Bo Chen

5
Nói cách khác, git rev-parselà viết tắt của git revision-parse. Nó nhận đầu vào đã cho và trả về ID sửa đổi 40 ký tự tương ứng.
Jonathan Benn

36

git rev-parseCũng hoạt động để có được tên chi nhánh hiện tại bằng cách sử dụng cờ --aboustv-ref như:

git rev-parse --abbrev-ref HEAD

Có thể nhận được một thông điệp cam kết theo cách này?
Leo Droidcoder

2
@LeoDroidcoder thửgit log --format=%B -n 1 <revision>
hipyhop 18/07/19
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.