2010-04-13 37 views
24

Tôi có một cái móc sau bản cập nhật trên máy chủ của tôi, như vậy mà khi tôiNgười dùng nào sử dụng git hook?

git push 

nó hoạt động kéo vào thư mục web sống. Tuy nhiên, trong khi push luôn thành công, hook post-update đôi khi thất bại.

Các móc là khá đơn giản:

#!/bin/sh 
# 
# An example hook script to prepare a packed repository for use over 
# dumb transports. 
# 
# To enable this hook, rename this file to "post-update". 
cd /var/www 
env -i git pull 

Tôi đẩy cập nhật từ nhiều nơi, nhưng đôi khi tôi phải đăng nhập với quyền root trên máy chủ và manuall làm một

env -i git pull 

Tôi chỉ phải làm điều đó 20% thời gian. Bất kỳ ý tưởng tại sao nó sẽ thất bại ngẫu nhiên? Ngoài ra, làm thế nào tôi sẽ nhận được nó để đăng nhập thông báo lỗi, vì nó có thể chạy như một người không thể ghi vào hệ thống tập tin?

+0

Bạn đang đẩy theo cùng một cách từ tất cả những nơi đó? Đó là, URL từ xa giống nhau cho tất cả chúng? (cụ thể, phần tên người dùng @ tên máy chủ) – Cascabel

+0

Ngoài ra, khi bạn nói nó không thành công, bạn có thực sự có nghĩa là nó không thành công với một quyền bị từ chối lỗi cho biết nó đang chạy với tư cách người dùng không có đủ đặc quyền? Hoặc là nó không cho một số lý do hoàn toàn không liên quan, không có gì để làm với uid chạy nó? – Cascabel

+0

Tôi thực sự đang đẩy từ những nơi khác nhau: đôi khi đó là user1 @ tên máy chủ, thời gian khác, user2 @ tên máy chủ, v.v. (tất cả đều có vấn đề này). Không thành công mà không có thông báo lỗi mà tôi có thể thấy và tôi không chắc chắn cách nhận thông báo lỗi. Trong bài đăng của tôi-cập nhật, tôi đã thêm,> echo $ USER> /log.txt, nhưng không có gì được viết ở đó (cũng không phải là tệp được tạo). Điều này khiến tôi nghĩ người dùng đang đẩy, không có quyền. Nhưng nếu tôi thậm chí không thể viết một thông báo lỗi, tôi sẽ biết như thế nào? – ash

Trả lời

18

Các móc được chạy khi người dùng thực hiện thao tác đẩy. Nếu bạn có một số loại thiết lập được tạo sẵn, có thể là người dùng như git hoặc gitosis hoặc có thể là bạn. Chỉ cần nhìn vào cách bạn đã cấu hình từ xa. (git remote show <remote-name> hoặc chỉ cần kiểm tra .git/config nếu bạn không biết) Có lẽ bạn đang đẩy thông qua SSH và có tên người dùng @ tên máy chủ trong URL.

P.S. Nó khá nhanh để chứng minh điều này - chỉ cần sao chép cục bộ, ném một móc hậu cập nhật với một số echo $USER hoặc một cái gì đó tương tự, và thử đẩy như chính bạn hoặc người dùng khác (trực tiếp hoặc thông qua ssh).

2

Tôi quyết định thử nghiệm này trên máy chủ gitlab 6 của tôi bằng cách tạo ra một tiền nhận móc và lặp lại ra thông tin người dùng

$ cat /home/git/repositories/foo/foo.git/hooks/pre-recieve 
#!/bin/bash 
set -x 
echo -e "The user the hook is run as is $USER" 
echo -e "Just to doublecheck, the user is $(whoami)" 
exit 1 

Có vẻ như nó được điều hành như người sử dụng git

$ git push 
Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done. 
Total 3 (delta 1), reused 0 (delta 0) 
remote: + echo -e 'The user the hook is run as is' 
remote: The user the hook is run as is 
remote: ++ whoami 
remote: + echo -e 'Just to doublecheck, the user is git' 
remote: Just to doublecheck, the user is git 
remote: + exit 1 
+0

Lý do là tất cả các máy chủ đó cấu hình một người dùng Unix để chấp nhận các kết nối ssh đến thông qua tệp '~ git/.ssh/authorized_keys'. Tệp đó ủy quyền các kết nối như vậy với một tập lệnh mà sau đó giao dịch với dữ liệu đến. Đối với các máy chủ như vậy, người ta có thể lấy được tên của người đang thực hiện cú đẩy, ví dụ: bằng cách cho rằng đó là cùng một người đã thực hiện cam kết gần đây nhất. Tuy nhiên điều này có thể không đúng sự thật. Phụ thuộc vào mô hình công việc của người dùng. Tốt hơn là chỉ cần kiểm tra hoặc báo cáo tác giả/người cam kết về các cam kết cá nhân. – cfi

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