Une autre approche consiste à maintenir les modifications locales des fichiers de configuration communs dans une autre branche privée. Je le fais pour certains projets qui nécessitent plusieurs modifications locales. Cette technique n'est peut-être pas applicable à toutes les situations, mais elle fonctionne pour moi dans certains cas.
Tout d'abord, je crée une nouvelle branche basée sur la branche master (dans ce cas particulier, j'utilise git-svn donc je dois commiter depuis master mais ce n'est pas très important ici) :
git checkout -b work master
Maintenant, modifiez le(s) fichier(s) de configuration si nécessaire et validez. Je mets généralement quelque chose de distinctif dans le message de commit comme "NOCOMMIT" ou "PRIVATE" (cela sera utile plus tard). A ce stade, vous pouvez travailler sur votre branche privée en utilisant votre propre fichier de configuration.
Lorsque vous voulez repousser votre travail en amont, choisissez chaque changement de votre work
vers le master. J'ai un script pour aider à faire cela, qui ressemble à quelque chose comme ceci :
#!/bin/sh
BRANCH=`git branch | grep ^\\* | cut -d' ' -f2`
if [ $BRANCH != "master" ]; then
echo "$0: Current branch is not master"
exit 1
fi
git log --pretty=oneline work...master | grep -v NOCOMMIT: | cut -d' ' -f1 | tac | xargs -l git cherry-pick
Cette première vérification s'assure que je suis sur le master
branche (vérification de l'intégrité). Ensuite, il liste chaque commit dans work
filtre ceux qui mentionnent le mot-clé NOCOMMIT, inverse l'ordre, et finalement sélectionne chaque commit (en commençant par le plus ancien) dans le fichier master
.
Enfin, après avoir poussé les changements dans le master en amont, je retourne à work
et rebase :
git checkout work
git rebase master
Git va réappliquer chacun des commits dans le fichier work
en sautant effectivement celui ou ceux qui ont déjà été appliqués dans la branche master
par le biais de la cueillette de cerises. Il ne devrait vous rester que les commits locaux NOCOMMIT.
Cette technique rend le processus de poussée un peu plus long, mais elle a résolu un problème pour moi, alors j'ai pensé que je devais partager.
1 votes
On dirait que vous avez un problème dans votre conception et dans le cerveau de vos collègues. Dites-leur de s'assurer qu'ils savent ce qu'ils commettent dans un système de contrôle de la source, sinon ils vont enregistrer de la merde que vous ne voulez pas. Aussi : Pourquoi ne pas simplement diviser le fichier, un fichier pour chaque système ?
11 votes
Je suis presque sûr que c'est un scénario assez commun ? Comment gardez-vous la trace de la configuration spécifique de la machine ? La division du fichier pour chaque système semble assez désordonnée et va à l'encontre de l'objectif d'un contrôle de version distribué : s'il est extrait sur une nouvelle machine, il ne devrait pas être nécessaire d'extraire un nouveau fichier.
1 votes
Vous pourriez au moins empêcher l'introduction des commits de rupture en utilisant un hook pre-update sur le dépôt partagé vers lequel vous poussez tous. Il peut rechercher les commits qui modifient le fichier de configuration fait par certains développeurs, ou il peut rechercher les commits touchant ce fichier qui ne mentionnent pas de mot-clé spécial dans le message.
3 votes
+1, ceci est un problème commun. @Pod : Il n'est pas pratique d'avoir "Joe.conf" dans le repo, mais vous voulez quand même pouvoir mettre à jour les choses de temps en temps... parfois les configs doivent subir des changements à cause de changements dans le code.