2013-07-18 29 views
10

Tôi thực hiện các bài kiểm tra đơn vị sau khi nhận nhưng không muốn người dùng chờ đợi.Git hook không đồng bộ?

Tôi đã thử các gợi ý từ danh sách git-mail người sử dụng ("chỉ & nó") nhưng điều này không làm việc: https://groups.google.com/forum/#!topic/git-users/CFshrDgYYzE

git dường như chờ đợi kịch bản bash để thoát ngay cả khi tôi chỉ cần đặt này trong móc/sau khi nhận:

exec-unit-tests.sh & 
+0

bạn đã thử các cách khác được đề xuất trong bài đăng đó, ví dụ: sử dụng cron để lên lịch công việc không đồng bộ? một cái gì đó như 'at' để lên kế hoạch công việc theo yêu cầu (và không xa trong tương lai) cũng có thể có giá trị nhìn vào –

+0

mà cũng có thể làm việc, tôi đã không thử nó. – oberhamsi

Trả lời

17

Điều này phù hợp với tôi. & và ống stderr stdout & phải được đóng lại:

long-running-command >&- 2>&- & 

Để đặt lệnh ở chế độ nền, cả stdoutstderr phải được đóng lại. Nếu một trong hai phần còn lại được mở thì tiến trình sẽ không ở chế độ nền và thao tác commit sẽ không hoàn thành cho đến khi kịch bản móc kết thúc.

Một cách tiếp cận khác lười biếng chỉ đơn giản là chuyển hướng stdoutstderr để /dev/null:

long-running-command >/dev/null 2>&1 & 

Đây là một chút ít sạch, nhưng có lẽ dễ dàng hơn để hiểu và ghi nhớ, và nó có tác dụng tương tự.

+0

được tìm thấy tại đây: http://git.661346.n2.nabble.com/Background-processes-in-post-receive-hook-td6235357.html – oberhamsi

+0

Thực tế cả hai 'stdout' và' stderr' phải được đóng (như câu trả lời của bạn đã làm điều đó). Nếu một trong hai người trong số họ còn mở thì quá trình sẽ không ở chế độ nền. Cá nhân tôi sử dụng '>/dev/null 2>/dev/null &' để có được cùng một hiệu ứng bởi vì nó dễ dàng hơn để biết những gì mà không nhìn lên trong 'người đàn ông bash'. – janos

+1

tôi thích giải pháp/dev/null của bạn tốt hơn! xin vui lòng làm cho nó một câu trả lời – oberhamsi

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