Développer des projets Django en utilisant Git

Je me request si quelqu'un a déjà travaillé sur des projets Django dans une petite équipe (3 dans mon cas), en utilisant la gestion de contrôle de source Git.

Le projet est hébergé sur un server de développement, c'est pourquoi j'ai un tel problème. Les développeurs ne peuvent pas voir si leur code fonctionne jusqu'à ce qu'ils aient validé leurs modifications dans leur référentiel local, puis les transmettent au server. Même alors, git ne semble pas mettre à jour les files dans le directory contenant le repository sur le server – probablement parce qu'il stocke seulement les changements pour économiser de l'espace.

Nous commençons à marcher sur les pieds quand nous travaillons sur ce projet, donc une sorte de contrôle de version est nécessaire – mais je n'arrive pas à find une solution.

Si quelqu'un a surmonté un problème similaire, j'aimerais entendre comment cela peut être fait.

Solutions Collecting From Web of "Développer des projets Django en utilisant Git"

Lors de l'envoi vers un référentiel distant, les meilleurs résultats sont lorsque le référentiel distant est un référentiel «nu» sans directory de travail. Il semble que vous ayez un directory de travail sur le repository distant, qui ne sera pas mis à jour par Git lors d'un push.

Pour votre situation, je recommand aux développeurs d'avoir leur propre environnement de test qu'ils peuvent tester localement avant d'avoir à pousser leur code ailleurs. Avoir un endroit central où tout le monde a besoin de pousser leur travail avant même qu'ils puissent l' essayer entraînera beaucoup de douleur et de souffrance.

Pour le deployment, je recommand de pousser vers un référentiel central "nu", puis d'avoir un process où le server de deployment tire le dernier code du référentiel central dans son directory de travail.

Lorsque vous poussez vers un référentiel git (partagé), il ne met pas à jour les files de travail de ce référentiel. Fondamentalement parce que les files de travail peuvent être sales et dans ce cas, vous devrez merge — et pour cela vous devez avoir un access shell complet, ce qui peut ne pas être le cas en général.

Si vous souhaitez que le «maître» le plus récent du référentiel partagé soit extrait quelque part, vous pouvez le faire en écrivant un hook post-mise à jour. Je vais donner un exemple ci-dessous que j'utilise pour extraire le sous-directory "ui" et le rendre disponible pour Apache.

Cependant, je dirai que je pense que votre process pourrait être amélioré. Les développeurs ont généralement besoin de servers personnels sur lesquels ils peuvent tester avant de passer à un point partagé: sinon, ce repo partagé risque d'être terriblement peu fiable. Considérez, si je pousse un changement à cela et ça ne marche pas, est-ce que c'est mon changement qui l'a brisé ou un effet secondaire de quelqu'un d'autre?

OK, je l'utilise comme un post-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: $@" } 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 

Comme mentionné, cela vérifie juste le sous-directory "ui". C'est le bit ": ui" qui définit new_tree_id. Il suffit de sortir le ": ui" (ou de le replace par "^ {tree}") pour tout voir.

Les checkouts vont dans le directory contenant le repo git, contrôlé par output_dir. Le script s'attend à être exécuté dans le repo git (qui à son tour devrait être nu): ce n'est pas très propre.

Les extractions sont placées dans les directorys "tree-XXXX" et un lien symbolique "actuel" a réussi à pointer vers le plus récent. Cela rend le changement de l'un à l'autre atomique, bien qu'il soit peu probable que cela prenne autant de time que cela soit important. Cela signifie également que les anciens récupèrent les anciens files. Et cela signifie aussi qu'il ronge l'espace disque en continuant à pousser les révisions …

Avait le même problème, travaillant également avec django.

Accepter de tester localement avant le deployment, comme déjà mentionné.

Vous pouvez ensuite pousser la version locale vers une nouvelle twig sur le server. Ensuite, vous faites une fusion avec cette twig et le maître. Après cela, vous verrez les files mis à jour.

Si vous avez accidentellement poussé à la twig maître, alors vous pouvez faire une réinitialisation git –hard. Cependant, toutes les modifications non validées dans la twig de travail en cours seront perdues. Alors prends soin de toi.