2010-04-03 39 views
7

Khi bạn kích hoạt trước khi nhận móc cho kho git:Git trước nhận móc

Phải mất không có đối số, nhưng đối với mỗi ref được cập nhật mà nó nhận được trên đầu vào tiêu chuẩn một dòng định dạng:

< cũ-value> SP < mới-value> SP < ref-name> LF

nơi < cũ-value> là tên đối tượng cũ được lưu trữ trong các ref, < mới-value> là tên đối tượng mới được lưu trữ trong ref và là đầy đủ nam e của ref. Khi tạo một ref mới, < old-value> là 40 0.

Có ai có thể giải thích cho tôi cách kiểm tra tất cả các tệp sẽ bị thay đổi trong kho nếu tôi cho phép cam kết này không?

Tôi muốn chạy các tệp đó thông qua một số tập lệnh để kiểm tra cú pháp, v.v.

Cảm ơn.

Trả lời

18

Thật kỳ lạ, tôi đã có một số mã được đặt xung quanh từ một tiện ích Wordpress có thể giúp ích. Sau đây sẽ cung cấp cho bạn một danh sách của tất cả các tập tin thay đổi trong nhận, cũng như nội dung của họ. Không có bảo đảm, có thể có lỗi, có thể không phải là cách hiệu quả nhất để làm điều đó, blah blah blah. Một số mã này được dựa trên các công cụ trong gitshelve, đó là một điều thực sự tuyệt vời để xem xét cho maniuplation chung git.

+0

Cảm ơn mã này, điều này đã giúp ích rất nhiều! Tôi đã thực hiện một tinh chỉnh nhỏ cho 'get_changed_files' để nó sử dụng' --name-only' giúp phân tích cú pháp kết quả dễ dàng hơn: https://gist.github.com/1055516 – keegan3d

1

Nếu bạn muốn biết liệu điều khoản của các tập tin được thay đổi trong kho địa phương trước khi đẩy vào kho lưu trữ từ xa, chạy git ls-tree -r commit, nơi cam kết là SHA cam kết giá trị của kho địa phương.

Lệnh này cung cấp danh sách tệp có quyền của chúng, có thể được phân tích cú pháp để kiểm tra xem quyền của tệp có bị thay đổi hay không trước khi đẩy.

9

Tôi vừa làm điều này. Đây là dòng chảy cơ bản tôi đã sử dụng.

Trong của bạn trước khi nhận móc, đọc từng dòng từ stdin, trong đó (như bạn nói) trông như thế này:

oldref newref refname 
  1. Đối với mỗi (oldref, newref) cặp bạn cần cho tất cả danh sách các cam kết:

    git show --format=format:%H --quiet oldref..newref 
    
  2. cho mỗi phạm bạn cần phải liệt kê tất cả các tập tin:

    git diff --name-only commit^..commit 
    
  3. để kiểm tra một tập tin, sử dụng git show:

    git show commit:filepath 
    

    làm bất cứ điều gì kiểm tra các nội dung tập tin tại đây.Nếu bạn muốn thông báo cho người dùng về một vấn đề, viết thư cho thiết bị lỗi chuẩn

  4. sau khi lặp lại tất cả các refs, cam và các file thoát khác không để từ chối việc đẩy mạnh, hoặc không cho phép nó

Lưu ý rằng điều này phương pháp tiếp cận đi tất cả các cam kết theo thứ tự, vì vậy nếu một tập tin được sửa đổi trong một số cam kết mỗi phiên bản sẽ được kiểm tra. Nếu bạn chỉ muốn xem từng tệp trong một lần nhấn, hãy chuyển qua các cam kết theo thứ tự ngược lại, và không kiểm tra tệp đã cho hai lần. Tuy nhiên, tôi khuyên bạn nên sử dụng phương pháp tiếp cận đầu tiên để kiểm tra tất cả các phiên bản của các tệp được đẩy.

+0

Bằng cách nào đó tôi không thể loại bỏ sự khác biệt trong 'git show --format = format:% H - cũ oldref..newref'. Có lẽ vì tôi đã thêm các tệp mới vào repo và diff khác với/dev/null: D. Tôi nghĩ rằng 'git log --format =% H oldref newref' nên làm tương tự và không có diff :) –

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