2012-03-11 32 views
23

Tôi muốn cập nhật một repo trần, và có nó làm điều gì đó sau khi một cái gì đó đã được đẩy vào nó bằng cách sử dụng một cái móc. Tôi nên sử dụng cái nào? Cuốn sách git-scm nói rằng cả hai đều cháy sau khi tất cả các ref đã được cập nhật, vì vậy tôi không biết sự khác biệt là gì.Sự khác nhau giữa sau khi nhận và sau khi cập nhật là gì?

Trả lời

16

Từ documentation:

hậu nhận:

này thay thế móc <post-update> ở chỗ nó được cả hai giá trị cũ và mới của tất cả các refs ngoài tên của họ.

sau update:

Các 'post-update' móc có thể nói gì được người đứng đầu đã được đẩy, nhưng nó không biết những gì giá trị ban đầu và cập nhật của họ, vì vậy nó là một nơi nghèo để làm đăng nhập cũ..new. Móc <post-receive> không nhận được cả giá trị ban đầu và được cập nhật của các lần chỉnh sửa. Bạn có thể xem xét nó thay vào đó nếu bạn cần chúng.

+1

Tất cả những gì tôi muốn làm là khởi chạy tập lệnh sẽ cập nhật tệp trên máy chủ của tôi (qua FTP) dựa trên cây đang hoạt động sau khi tôi đã đẩy tới repo đó. Vì vậy, nó là ba nơi: một repo địa phương, một repo địa phương, và một vị trí FTP (không git).Khi tôi đẩy vào một repo, tôi sẽ là thời điểm tốt nhất để khởi chạy một kịch bản như vậy (tôi sẽ sử dụng 'git diff' để tìm ra những file nào trên FTP)? – trusktr

+3

sau khi nhận là một tập hợp siêu chức năng của bản cập nhật, và sau khi người đứng đầu được đẩy nên tôi tưởng tượng sau khi nhận được là đủ. –

+1

Tôi đồng ý với Waynn Lue - chúng tôi làm điều gì đó tương tự và sử dụng 'post-receive' – Nic

5

Một recent commit cho Git 2.2 + (November 2014), bởi Junio C Hamano (gitster) làm đề cập đến:

Các pre-receivepost-receive móc được thiết kế để có một sự cải tiến so với phong cách cũ updatepost-update móc, mà mất thông tin cập nhật trên dòng lệnh của họ và bị giới hạn bởi giới hạn độ dài dòng lệnh.

Thông tin tương tự được nạp từ đầu vào tiêu chuẩn vào móc trước/sau khi nhận để thay thế giới hạn này.

Bắt buộc phải sử dụng các móc kiểu mới này để tiêu thụ thông tin cập nhật hoàn toàn từ luồng đầu vào tiêu chuẩn. Nếu không, họ sẽ có nguy cơ giết chết quá trình nhận gói thông qua SIGPIPE.

tại Nó cho biết thêm:

Nếu một cái móc không muốn nhìn vào tất cả các thông tin, nó rất dễ dàng để gửi đầu vào tiêu chuẩn của nó để /dev/null (có lẽ việc sử dụng thích hợp của móc có thể cần phải biết chỉ một thực tế là một cú đẩy được thực hiện, mà không cần phải biết những gì các đối tượng đã được đẩy để cập nhật mà refs), và điều này đã được thực hiện bởi móc hiện có được viết cẩn thận. Tuy nhiên, bởi vì không có cách nào tốt để luôn thất bại móc không tiêu thụ đầy đủ đầu vào (một cú đẩy nhỏ có thể dẫn đến bản ghi cập nhật ngắn có thể vừa với bộ đệm ống mà quá trình receive-pack có thể quản lý viết trước khi móc có cơ hội thoát ra mà không đọc bất kỳ thứ gì, điều này sẽ không dẫn đến chết theo SIGPIPE của receive-pack), có thể dẫn đến khó chẩn đoán lỗi ảo "một lần trong một mặt trăng xanh".

Nhấc "móc này phải tiêu thụ đầy đủ đầu vào" của họ.

+0

Hmm. Chỉ cần làm rõ. 'Nâng này "móc phải tiêu thụ đầy đủ đầu vào của họ" ủy nhiệm. " - nó có nghĩa là chính xác những gì nó đọc: nó * đã không * được dỡ bỏ, nhưng chỉ là một điều ước cho ông già Noel, bị thất lạc một cách kỳ lạ trong một thông điệp cam kết? Hoặc là nó thực sự "nâng * ed *", vì vậy chúng tôi cuối cùng có thể ăn mừng? :) Cảm ơn! –

+0

@Sz. Nó được nâng lên. Đó là bởi vì "Nhiệm vụ không được thực thi nghiêm ngặt không giúp chúng tôi bắt lỗi trong số móc" Do hậu quả của nhiệm vụ được dỡ bỏ đó: "Nếu móc có lý do chính đáng để quyết định kết quả hoạt động mà không đọc thông tin chúng tôi cho nó ăn, hãy để nó làm như vậy. ” – VonC

+0

OK, cảm ơn. Vấn đề là với từ ngữ, căng thẳng không chính xác được sử dụng trong thông điệp, làm cho nó mơ hồ. Và git đã dạy tôi không bao giờ tin vào sự lựa chọn mơ hồ của nó về những lời nói theo mệnh giá. Và bây giờ tôi có thể +1 câu trả lời của bạn, mà tôi có thể xem xét hoàn chỉnh với nhận xét của bạn. –

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