Internet hoàn toàn bị phân tán với các câu trả lời sai và không lý tưởng cho câu hỏi này. Điều này là không may bởi vì bạn sẽ nghĩ rằng đây sẽ là một điều phổ biến bạn sẽ muốn làm.Kiểm tra những gì sắp sửa được thực hiện trong một móc trước cam kết
Sự cố: Khi chạy móc pre-commit
, kho lưu trữ có thể không sạch. Vì vậy, nếu bạn ngây thơ chạy thử nghiệm của bạn, họ sẽ không được chống lại những gì bạn đang cam kết, nhưng bất cứ điều gì bẩn xảy ra được trong cây làm việc của bạn.
Điều hiển nhiên cần làm là git stash --keep-index --include-untracked
ở đầu số pre-commit
và git pop
khi thoát. Bằng cách đó bạn đang thử nghiệm với chỉ số (thuần), đó là những gì chúng tôi muốn. Không may, điều này tạo ra các dấu xung đột hợp nhất nếu bạn sử dụng git add --patch
, (đặc biệt nếu bạn chỉnh sửa khối), vì nội dung của [email protected]{0}
có thể không khớp với cây công việc sau khi cam kết.
Một giải pháp phổ biến khác là sao chép kho lưu trữ và chạy thử nghiệm trong một tạm thời mới. Có hai vấn đề với điều đó: Một là chúng tôi chưa cam kết, vì vậy chúng tôi không thể dễ dàng có được một bản sao của kho lưu trữ ở trạng thái chúng tôi sắp cam kết (tôi chắc chắn có một cách để làm điều đó , nhưng tôi không quan tâm vì :). Thứ hai, các bài kiểm tra của tôi có thể nhạy cảm với vị trí của thư mục làm việc hiện tại. Ví dụ vì cấu hình môi trường cục bộ.
Vì vậy: Làm cách nào tôi có thể khôi phục cây công việc của mình về trạng thái trước khi xuất hiện trước git stash --keep-index --include-untracked
mà không giới thiệu các dấu xung đột hợp nhất và không sửa đổi sau HEAD
sau cam kết?
Các cam kết trước kịch bản nhận được dữ liệu được cam kết như là đầu vào. Tại sao bạn cần phải nhìn vào bất cứ điều gì khác? Có lẽ những gì bạn đang cố gắng làm tốt nhất sẽ được thực hiện trong một cái gì đó khác hơn là một cái móc trước cam kết. Những loại kiểm tra nào bạn muốn làm điều đó yêu cầu truy cập vào kho lưu trữ đầy đủ? –
@WilliamPursell: Bạn có ý nghĩa gì bởi "dữ liệu được cam kết?". Kịch bản trước cam kết chạy trong cây làm việc của tôi (tức là cơ sở của kho lưu trữ nguồn). Vấn đề là nếu bạn thực hiện một số thay đổi đối với kho lưu trữ và chỉ một vài trong số chúng (ví dụ, bạn thêm một số tệp nhưng không phải tệp khác), thì bạn sẽ không thử nghiệm cam kết trước khi nó xảy ra (những gì tôi muốn làm), bạn sẽ kiểm tra những gì bạn có trong thư mục làm việc của mình. – pwaller
Bản vá bạn cam kết có sẵn trên stdin cho móc trước khi cam kết. Bạn đang thử nghiệm điều gì nếu không phải là bản vá đang được cam kết? Mục đích của hook trước khi commit là xác minh patch. –