Question

Chaque fois que je commets, je crains que je l'ai manqué une dépendance et je suis à la recherche de la façon la plus simple de tester mon arbre git dans l'isolement pour assurer tout ce qui est de l'indice git ( « mis en scène ») va dans la compilation de fait / courir eux-mêmes.

Mon dépendances de codes existent dans le système de fichiers d'où je fais le « git add » et la compilation si simple et l'exécution des tests ne garantit pas que tout ce que je checkin compilerions / courir si l'arbre (ou une zone de stockage intermédiaire) a été checkout sur sur un système de fichiers propre.

Je pourrais avoir une accumulation continue qui vérifierait après la soumission, mais je préfère ne pas avoir de mauvaises commits dans l'histoire que j'ai plus tard patch. Je veux donc un moyen de créer un environnement isolé qui comprend une caisse de l'arbre, ainsi que l'index / zone de stockage intermédiaire.

Une chose que j'ai pris en compte est deux fois en utilisant git stash, i.e.:.

  1. Invoke 'git stash' pour enregistrer les fichiers dans l'index
  2. obtenir une certaine façon une liste des fichiers non suivis, « git add » tous ces fichiers, enregistrez une nouvelle planque
  3. Supprimez tous les fichiers précédemment trassez
  4. Restaurer la planque d'origine
  5. Je dois maintenant avoir un environnement propre qui a seul le code déjà vérifié dans le code et dans la zone de mise en scène que je peux compiler et tester.
  6. Une fois terminé, je restaurer la planque des fichiers non suivis puis les untrack me laisser dans la même position que j'étais à l'origine.

(Ces fichiers non suivis peuvent être utiles mais pas nécessairement ce que je veux vérifier dans le référentiel - par exemple les projets Eclipse).

Je sens que je suis overengineering un problème simple, cependant.

Était-ce utile?

La solution

Installer ce script (ou quelque chose comme ça - le mien est volé trop) comme un crochet pre-commit. Il copie l'index à un répertoire de travail temporaire et exécute une construction là-bas. Il va attraper les fichiers que vous avez manqué.

Je sais qu'il ya au moins un ou deux autres questions de SO qui traitent de cette question exacte - test / validation de l'index au lieu du répertoire de travail dans un crochet pre-commit - mais je ne peux pas sembler les trouver à droite maintenant.

(Pour être complet, j'ai ce script dans mon repo .git crochets / pre-commit / test l'indice, il y a deux ou trois autres scripts il Voir ci-dessous pour ce que je suis en utilisant comme. .git / hooks / pre-commit).

#!/bin/sh
#
# Via: http://github.com/jwiegley/git-scripts/blob/master/pre-commit.sh
#

if [ ! $(git rev-parse --symbolic-full-name HEAD) = refs/heads/master ]; then
    exit 0
fi

# These are the locations I keep my temporary source and build trees in
TMPDIR=$HOME/code/myproject-pre-commit
MIRROR=$HOME/code/myproject-pre-commit-mirror

# Exit with status 1 if any command below fails
set -e

# Checkout a copy of the current index into MIRROR
git checkout-index --prefix=$MIRROR/ -af

# Remove files from MIRROR which are no longer present in the index
git diff-index --cached --name-only --diff-filter=D -z HEAD | \
    (cd $MIRROR && xargs -0 rm -f --)

# Copy only _changed files_ from MIRROR to TMPDIR, without copying timestamps.
# This includes copying over new files, and deleting removed ones.  This way,
# "make check" will only rebuild what is necessary to validate the commit.
rsync -rlpgoDOc --delete --exclude-from=.git-hooks/excludes $MIRROR/ $TMPDIR/

# Everything else happens in the temporary build tree
cd $TMPDIR

nosetests

exit 0

Ceci est mon .git réelle / crochets / pre-commit:

#!/bin/bash

set -e
for hook in $(find .git-hooks/pre-commit -perm /u+x,g+x,o+x -type f -not -name '*~' 2>/dev/null)
do
  echo "@@ Running hook: $(basename $hook)"
  $hook "$@"
done

Autres conseils

git stash -u --keep-index avant le test, suivi par git stash pop après le test.

Configuration ignorer les fichiers importants et effacer tout simplement ceux qui ne sont pas importants git clean -df

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top