我想知道是否有人使用Git源代码管理来管理一个小团队(在我的案例中为3个)的Django项目。
项目托管在开发服务器上,这就是我遇到这样一个问题的原因。开发人员无法查看他们的代码是否有效,直到他们将更改提交到本地存储库,然后将这些更改推送到服务器。然而,即便如此,git似乎并没有更新服务器上存放存储库的目录中的文件 - 可能是因为它只存储了更改以节省空间。
在处理这个项目时,我们开始踩到彼此的脚趾,因此需要某种版本控制 - 但我无法找到解决方案。
如果有人克服了类似的问题,我很想知道如何做到这一点。
答案 0 :(得分:12)
当推送到远程存储库时,最好的结果是远程存储库是一个没有工作目录的“裸”存储库。听起来你在远程存储库上有一个工作目录,在执行推送时Git不会更新它。
对于您的情况,我建议开发人员拥有自己的测试环境,他们可以在本地测试,然后再将代码推送到其他地方。拥有一个中心位置,每个人都需要在他们甚至尝试之前推动他们的工作,这将导致许多痛苦和痛苦。
对于部署,我建议推送到一个中央“裸”存储库,然后建立一个流程,部署服务器将从中央存储库中的最新代码拉入其工作目录。
答案 1 :(得分:3)
当您推送到(共享)git存储库时,它不会更新该存储库的工作文件。基本上是因为工作文件可能很脏,在这种情况下你必须合并---为此你需要在那里拥有完整的shell访问权限,这可能不是一般的情况。
如果您希望在某处检出共享仓库的最新“主”,可以通过编写更新后的挂钩来安排。我将给出一个下面的示例,我用它来查看“ui”子目录并将其提供给Apache。
但是,我会说我认为您的流程可以改进。开发人员通常需要在推送到共享点之前可以测试的个人服务器:否则共享仓库可能会非常不可靠。考虑一下,如果我对它进行更改并且它不起作用,那是我的更改是否打破了它或其他人的副作用?
好的,我将它用作更新后的钩子:
#!/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: $@"
}
die() {
echo "post-update: $@" >&2
exit 1
}
output_dir=..
for refname in "$@"; 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
如上所述,这只是检查“ui”子目录。那是设置new_tree_id的“:ui”位。只需取出“:ui”(或更改为“^ {tree}”)即可查看所有内容。
Checkout进入包含git repo的目录,由output_dir控制。该脚本期望在git repo中运行(反过来预计是裸的):这不是很干净。
将结帐放入“tree-XXXX”目录,并将“当前”符号链接设置为指向最新的。这使得从一个原子到另一个原子的变化,尽管它不太可能需要很长时间才能重要。它还意味着恢复重用旧文件。而且它还意味着它会随着你继续推动修改来咀嚼磁盘空间......
答案 2 :(得分:0)
有同样的问题,也在使用django。
如前所述,同意在部署之前在本地进行测试。
然后,您可以将本地版本推送到服务器上的新分支。然后你与这个分支和主人合并。在此之后,您将看到更新的文件。
如果你不小心推到了主分支,那么你可以做一个git reset --hard。但是,当前工作分支中未提交的所有更改都将丢失。所以要小心。