Khi bạn đẩy tới kho lưu trữ git (được chia sẻ), nó không cập nhật các tệp làm việc của kho lưu trữ đó. Về cơ bản vì các tệp làm việc có thể bị bẩn và trong trường hợp đó, bạn phải hợp nhất --- và cho rằng bạn cần có toàn quyền truy cập shell ở đó, có thể không phải là trường hợp nói chung.
Nếu bạn muốn có "tổng thể" gần đây nhất của repo được chia sẻ được kiểm tra ở đâu đó, bạn có thể sắp xếp cho điều đó bằng cách viết một móc hậu cập nhật. Tôi sẽ đưa ra một ví dụ dưới đây mà tôi sử dụng để kiểm tra thư mục con "ui" và làm cho nó có sẵn cho Apache.
Tuy nhiên, tôi sẽ nói rằng tôi nghĩ rằng quá trình của bạn có thể được cải thiện. Các nhà phát triển thường cần các máy chủ cá nhân mà họ có thể kiểm tra trước khi chuyển sang một điểm được chia sẻ: nếu không, repo được chia sẻ đó có thể sẽ không đáng tin cậy. Hãy xem xét, nếu tôi đẩy một thay đổi cho nó và nó không hoạt động, là sự thay đổi của tôi đã phá vỡ nó hoặc một tác dụng phụ của người khác?
OK, tôi sử dụng như một cái móc sau update:
#!/bin/sh
# Should be run from a Git repository, with a set of refs to update from on the command line.
# This is the post-update hook convention.
info() {
echo "post-update: [email protected]"
}
die() {
echo "post-update: [email protected]" >&2
exit 1
}
output_dir=..
for refname in "[email protected]"; do
case $refname in
refs/heads/master)
new_tree_id=$(git rev-parse $refname:ui)
new_dir="$output_dir/tree-$new_tree_id"
if [ ! -d "$new_dir" ]; then
info "Checking out UI"
mkdir "$new_dir"
git archive --format=tar $new_tree_id | (cd $new_dir && tar xf -)
fi
prev_link_target=$(readlink $output_dir/current)
if [ -n "$prev_link_target" -a "$prev_link_target" = "tree-$new_tree_id" ]; then
info "UI unchanged"
else
rm -f $output_dir/current
ln -snf "tree-$new_tree_id" "$output_dir/current"
info "UI updated"
title=$(git show --quiet --pretty="format:%s" "$refname" | \
sed -e 's/[^A-Za-z][^A-Za-z]*/_/g')
date=$(git show --quiet --pretty="format:%ci" "$refname" | \
sed -e 's/\([0-9]*\)-\([0-9]*\)-\([0-9]*\) \([0-9]*\):\([0-9]*\):\([0-9]*\) +0000/\1\2\3T\4\5\6Z/')
ln -s "tree-$new_tree_id" "$output_dir/${date}__${title}"
fi
;;
esac
done
Như đã đề cập, điều này chỉ kiểm tra ra "ui" thư mục con. Đó là thiết lập bit ": ui" new_tree_id. Chỉ cần lấy ": ui" ra (hoặc thay đổi thành "^ {tree}") để kiểm tra mọi thứ.
Kiểm tra nằm trong thư mục chứa repo git, được kiểm soát bởi output_dir. Kịch bản dự kiến sẽ được chạy bên trong repo git (mà lần lượt dự kiến sẽ được trần): đây không phải là rất sạch sẽ.
Kiểm tra được đưa vào thư mục "tree-XXXX" và liên kết tượng trưng "hiện tại" được trỏ đến điểm gần đây nhất. Điều này làm cho sự thay đổi từ nguyên tử này sang nguyên tử khác, mặc dù khó có thể mất nhiều thời gian đến mức nó quan trọng.Nó cũng có nghĩa là reverts tái sử dụng các tập tin cũ. Và nó cũng có nghĩa là nó nhét không gian đĩa khi bạn tiếp tục đẩy các bản sửa đổi ...
+1 Cây git-not-updating-remote-working-tree là một vấn đề phụ. Các nhà phát triển chỉ đơn giản là PHẢI từng có một thiết lập thử nghiệm làm việc tại địa phương (trung thực, với SQLite và máy chủ django dev nó không khó). –
Bạn có thể liên kết đến tài nguyên về cách thiết lập quy trình phát triển mà bạn đề xuất cho người mới sử dụng Django như tôi không? –