2008-09-02 33 views
34

Duyệt qua tài liệu git, tôi không thể thấy bất kỳ điều gì tương tự với móc cam kết của SVN hoặc các tính năng "propset" có thể, cập nhật số phiên bản hoặc thông báo bản quyền trong một tệp bất cứ khi nào nó được lưu trữ.Git có bất cứ điều gì giống như `svn propset svn: keywords` hoặc pre-/ post-cam hooks?

Người dùng git có dự kiến ​​viết các tập lệnh bên ngoài cho loại chức năng này (có vẻ như không nằm ngoài câu hỏi) hoặc tôi vừa bỏ sót điều gì đó hiển nhiên?

Sửa: Chỉ cần được rõ ràng, tôi quan tâm nhiều hơn trong, ví dụ:

svn propset svn:keywords "Author Date Id Revision" expl3.dtx 

nơi một chuỗi như thế này:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $ 

được giữ cập nhật lên với thông tin liên quan bất cứ khi nào một cam kết xảy ra.

Trả lời

14

Trích dẫn từ Git FAQ:

Liệu git có mở rộng từ khóa?

Không được đề xuất. Mở rộng từ khóa gây ra tất cả các loại vấn đề lạ và không thực sự hữu ích, đặc biệt là trong ngữ cảnh của một SCM. Bên ngoài git, bạn có thể thực hiện mở rộng từ khóa bằng cách sử dụng tập lệnh. Nhân Linux xuất khẩu kịch bản thực hiện điều này để thiết lập biến EXTRA_VERSION trong Makefile.

Xem gitattributes (5) nếu bạn thực sự muốn thực hiện việc này. Nếu bản dịch của bạn không phải là có thể đảo ngược (ví dụ: mở rộng từ khóa SCCS), điều này có thể có vấn đề.

+5

Tôi đã thấy điều này mà làm việc khá tốt với các dự án git: https : //github.com/turon/git-rcs-keywords – Mark

+0

@PA Nếu câu trả lời miễn phí không phù hợp với bạn, vui lòng bỏ qua nó. Từ các liên kết được đưa ra ở đây, nó là dễ dàng, đủ để tìm một lời giải thích tốt hơn. Việc khiếu nại cũng không giúp bạn có được kiến ​​thức. Và nó được gọi là Git, chứ không phải GIT. –

+1

Cảm ơn bạn đã trỏ đến Câu hỏi thường gặp về Git. Tôi thấy câu nói này thú vị: "Mở rộng từ khóa ... không thực sự hữu ích." Là một nhà phát triển hỗ trợ, tôi tham khảo các thuộc tính mã nguồn hàng ngày. Ví dụ, các thủ tục lưu trữ cơ sở dữ liệu của chúng tôi nằm trong điều khiển nguồn với các thuộc tính sửa đổi ở trên cùng. Tôi có thể sử dụng thuộc tính sửa đổi để xác minh phiên bản của thủ tục được lưu trữ nào được cài đặt trên cơ sở dữ liệu. –

2

Có lẽ thuộc tính SVN phổ biến nhất, 'svn: ignore' được thực hiện thông qua tệp .gitignore, chứ không phải siêu dữ liệu. Tôi e rằng tôi không có gì hữu ích hơn cho các loại siêu dữ liệu khác.

4

Git không có móc trước và sau cam kết, chúng nằm bên trong mỗi thư mục .git/hooks. Chỉ cần sửa đổi các tập tin và chmod chúng để làm cho chúng thực thi được.

18

Tôi đã viết một fairly complete answer vào nơi khác, với mã hiển thị cách thực hiện. Bản tóm tắt:

  1. Có thể bạn không muốn làm điều này. Sử dụng git describe là giải pháp thay thế hợp lý.
  2. Nếu bạn cần thực hiện việc này, $Id$$Format$ khá dễ dàng.
  3. Mọi thứ nâng cao hơn sẽ yêu cầu sử dụng gitattributes và bộ lọc tùy chỉnh. Tôi cung cấp triển khai ví dụ về $Date$.

Giải pháp dựa trên các chức năng móc thường không hữu ích, vì chúng làm cho bản sao làm việc của bạn bị bẩn.

1

Mặc dù một tuổi Q & A. Tôi nghĩ rằng tôi muốn ném một trong vì điều này đã làm tôi thất vọng trong một thời gian dài.

Tôi được sử dụng để liệt kê các tệp trong thư mục theo thứ tự thời gian ngược (vui tôi, heh?).Lý do là tôi muốn xem những tập tin mà tôi có (hoặc bất kỳ ai khác) đã thay đổi gần đây.

Git sẽ làm hỏng kế hoạch của tôi vì khi chuyển nhánh, repo cục bộ sẽ ghi đè hoàn toàn tệp được theo dõi từ bản sao (gia tăng ... Tôi biết ...) nằm trong repo cục bộ được đóng gói.

Bằng cách này, tất cả các tệp đã được kiểm tra sẽ mang dấu thời gian của quá trình thanh toán và sẽ không phản ánh thời gian sửa đổi cuối cùng của chúng ..... Làm thế nào để gây phiền nhiễu.

Vì vậy, tôi đã phát minh ra một lớp lót trong bash sẽ cập nhật thuộc tính $ Date: $ bên trong bất kỳ tệp nào VỚI THỜI GIAN SỬA CHỮA LAST THEO NHỮNG GÌ ĐÓ CÓ TRONG HỆ THỐNG FILE sao cho tôi có ngay lập tức tuyên bố sửa đổi lần cuối mà không phải duyệt qua git log, git show hoặc bất kỳ công cụ nào khác cung cấp thời gian cam kết ở chế độ đổ lỗi.

Quy trình sau sẽ sửa đổi từ khóa $ Date: $ chỉ trong các tệp được theo dõi sẽ được cam kết với repo. Nó sử dụng git diff --name-only sẽ liệt kê các tệp đã được sửa đổi và không có gì khác ....

Tôi sử dụng thủ công một lớp này trước khi cam kết mã. Một điều mặc dù là tôi phải điều hướng đến thư mục gốc của repo trước khi áp dụng điều này.

Đây là biến thể mã cho Linux (dán như một dòng đa để có thể đọc)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \ 
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \ 
    set -- $l; f=$1; shift; d=$*; modif=`date -d "@$d"`; \ 
    perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \ 
    git add $f; done 

và OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \ 
    set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \ 
    perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \ 
    git add $f; done 
Các vấn đề liên quan